目录
环境
mysql 5.7.36
系统:ubuntu18.04
使用半同步复制、一主一从架构
两台主机:主节点192.168.0.104,从节点192.168.0.105
安装mysql
https://dev.mysql.com/downloads/mysql/5.7.html?os=src 下载mysql
sudo dpkg -i mysql下载的包名
sudo apt install mysql-server
过程中输入root 密码,等待安装完毕 ,查看mysql是否启动
service mysql status
配置允许远程访问mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
如果还不能远程访问,在/etc/mysql 下找.cnf文件,在[mysqld]配置中添加
bind-address = 0.0.0.0
重启service mysql restart
数据库配置文件
/etc/mysql/my.cnf是个总的配置文件,里面标注了配置文件包括以下两个路径
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
/etc/mysql/mysql.conf.d/ 目录下有 mysqld.cnf mysqld_safe_syslog.cnf 两个文件,可见mysqld.cnf是[mysqld]的配置,如果my.cnf和mysqld.cnf里配置重复,mysqld.cnf生效。
异步复制
修改数据库配置文件
sudo vim /etc/mysql/my.cnf
主节点
[mysqld]
server-id=100
log-bin=mysql-bin
binlog_format=row
从节点
[mysqld]
server-id=101
log-bin=mysql-bin
binlog_format=row
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=on
relay_log_recovery=1
主数据库建立复制用户并授权
mysql> GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)
备份主库,初始化从库
把主库的数据备份,在从库上恢复,主库名称testcopy
mysqldump -uroot -proot --single-transaction --master-data=2 --databases testcopy>/tmp/testcopy.dmp
- --master-data=2,使dmp文件记录备份这一时刻的binlog文件和position号
- --single-transaction在导出前开启一个事务
cat testcopy.dmp 查看dmp文件,能看到备份时刻使用的binlog文件名和position号
把dmp放到从库上,恢复数据,从库就会产生testcopy库及其数据
mysql -uroot -proot <testcopy.dmp
在从库执行主从配置命令
change master to master_host='192.168.0.104',master_user='mysync',master_password='123456',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=1197
启动从库
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
查询从库状态
show slave status\G;
slave两个线程状态一定要是yes,Slave_IO_Running: Yes Slave_SQL_Running: Yes
验证
在主库修改数据,从库数据也会修改
优化
mysql参数innodb_flush_log_at_trx_commit,sync_binlog 两者设置为1,保证主库数据不丢失,从库数据最终一致性。
半同步复制
在主库安装半同步插件、开启半同步功能、将超时时间设置的比较大防止网络原因导致超时。
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.05 sec)
mysql> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.00 sec)
mysql> set global rpl_semi_sync_master_timeout=30000;
Query OK, 0 rows affected (0.00 sec)
在从库安装插件、开启半同步
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.05 sec)
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
也可以把上面设置全局变量 分别放到主从的my.cnf文件中,保证重启后自动执行半同步复制。
重启从库的io线程,激活半同步
mysql> stop slave io_thread;
Query OK, 0 rows affected (0.02 sec)
mysql> start slave io_thread;
Query OK, 0 rows affected (0.01 sec)
在从库查看半同步状态:
mysql> show status like '%semi_sync%'
-> ;
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
在主库查看:Rpl_semi_sync_master_clients 为1说已经有一个从库连接到了主库,是半同步模式。 Rpl_semi_sync_master_status 为ON。
mysql> show status like '%semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)