1 什么是主從
主從同步使得數據可以從一個數據庫服務器復制到其他服務器上,在復制數據時,一個服務器充當主服務器(master),其余的服務器充當從服務器(slave)。因為復制是異步進行的,所以從服務器不需要一直連接著主服務器,從服務器甚至可以通過撥號斷斷續續地連接主服務器。通過配置文件,可以指定復制所有的數據庫,某個數據庫,甚至是某個數據庫上的某個表。
2 主從解決的問題
1.通過增加從服務器來提高數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,可以動態地調整從服務器的數量,從而調整整個數據庫的性能。
2.提高數據安全-因為數據已復制到從服務器,從服務器可以終止復制進程,所以,可以在從服務器上備份而不破壞主服務器相應數據。
3.在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提高主服務器的性能。
3 主從原理
1.每個從僅可以設置一個主。
2.主在執行SQL之后,記錄二進制log文件(bin-log)。
3.從連接主,并從主獲取bin-log,存于本地relay-log,并從上次記住的位置起執行SQL,一旦遇到錯誤則停止同步。
4 配置步驟
配置-主
1.創建一個用戶,并給予權限
mysql> create user `dark`@`%` identified by "root";
mysql> grant all on *.* to `dark`@`%` with grant option;
2.開啟binlog日志
在/etc/my.cnf文件的[mysqld]下寫入如下:
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
配置-從
1.修改server_id
server_id = 2
2.配置主從
change master to master_host="192.168.63.123",master_port=3306,master_user=root,master_password=root,master_log_file="mysql-bin.000001",master_log_pos=4
5 實踐
1.進入主容器(主mysql默認搭建完成),查看相關信息
查看用戶信息
mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| dark | % | mysql_native_password |
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
查看bin-log信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 321925 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.創建相關配置文件目錄,修改配置文件
cp /etc/my.cnf /docker/mysql-slave1/conf/
cp /etc/my.cnf /docker/mysql-slave2/conf/
修改兩個配置文件的端口分別為3307、3308,以及server-id = 2、server-id = 3
3.創建兩個容器
docker run -p 3307:3307 -d --name mysql-slave1 -v /docker/mysql-slave1/conf/my.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql
docker run -p 3308:3308 -d --name mysql-slave2 -v /docker/mysql-slave2/conf/my.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql
4.從,相關配置
進入容器salve1,進行相關配置
mysql>change master to master_host="172.17.0.4",master_port=3306,master_user="dark",master_password="root",master_log_file="mysql-bin.000003",master_log_pos=321925;
mysql> start slave;
mysql> show slave status\G;
slave2和上述配置相同,不再贅述。
在主中新建數據庫,查看從是否會同步。
mysql> create database lmrs_users;
Query OK, 1 row affected (0.00 sec)
6 mycat配置主從
<dataHost name="lmrs_order" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.35.139:3306" user="root" password="root">
<readHost host="hostS2" url="192.168.35.139:3307" user="root" password="root"/>
<readHost host="hostS3" url="192.168.35.139:3308" user="root" password="root"/>
</writeHost>
</dataHost>
如果
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
可能是數據庫主從發生了故障
解決方法:
1、先停止同步:mysql>stop slave;
2、使用命令:mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
3、開啟同步:mysql>start slave;
4、使用命令:mysql>show slave status\G,查看Slave_SQL_Running的值,如果不為Yes,則重復上述3步,直到為Yes