在mysql数据库管理中,实现互为主从的配置是一种常见的高可用性和数据冗余策略。
这种配置允许两个mysql服务器相互复制数据,每个服务器既是对方的主服务器也是从服务器。
这样,无论哪个服务器发生故障,另一个都可以接管,保证数据的持续可用性和一致性。
一、环境准备
- 准备两台虚拟机(192.168.4.51 192.168.4.52)
- 关闭防火墙和selinux
- 确保两台虚拟机网络互通
- 两台虚拟机都安装了mysql(5.7及以上的版本)
二、配置互为主从
1.编辑/etc/my.cnf文件
vim /etc/my.cnf
在[mysqld]模块下添加以下代码段
[mysqld] server-id=51 #标识 log_bin=/var/lib/mysql/mysql_log_bin #开启binlog并指定路径 binlog_format=mixed #binlog 格式(mixed 兼容 row 和 statement) log_slave_updates #开启主从 auto_increment_increment = 2 #主键自增量 auto_increment_offset = 1 #主键起始偏量
两台虚拟机操作一样 只是主键起始偏量不同为了避免主键相同而让其错开
让51主机的主键成 1 , 3 ,5 ,7…
而52主机的主键成 2 , 4, 6, 8…
vim /etc/my.cnf [mysqld] server-id=52 #标识 log_bin=/var/lib/mysql/mysql_log_bin #开启binlog并指定路径 binlog_format=mixed #binlog 格式(mixed 兼容 row 和 statement) log_slave_updates #开启主从 auto_increment_increment = 2 #主键自增量 auto_increment_offset = 2 #主键起始偏量
重启mysql服务
[root@host51 ~]# systemctl restart mysqld
2.创建授权用户
两台虚拟机操作一样
mysql -uroot -p你的密码
创建连接用户 mysql> create user 'repl'@'%' identified by '123qqq...a'; query ok, 0 rows affected (0.00 sec) 授权连接用户 mysql> grant replication slave on *.* to 'repl'@'%'; query ok, 0 rows affected (0.00 sec) 刷新权限 mysql> flush privileges; query ok, 0 rows affected (0.00 sec)
3.查看binlog日志信息
查看192.168.4.51
mysql> show master status; +----------------------+----------+--------------+------------------+-------------------+ | file | position | binlog_do_db | binlog_ignore_db | executed_gtid_set | +----------------------+----------+--------------+------------------+-------------------+ | mysql_log_bin.000004 | 1007 | | | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.01 sec)
查看192.168.4.52
mysql> show master status -> ; +----------------------+----------+--------------+------------------+-------------------+ | file | position | binlog_do_db | binlog_ignore_db | executed_gtid_set | +----------------------+----------+--------------+------------------+-------------------+ | mysql_log_bin.000004 | 1007 | | | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
4.配置主从
首先在51主机上配置(52为主机)
mysql> change master to master_host='192.168.4.52', #设置主的ip地址 master_user='repl', #设置连接用户名 master_password='123qqq...a', #设置连接用户密码 master_log_file='mysql_log_bin.000004', #设置binlog文件名 master_log_pos=1007; #设置binlog 同步位置 query ok, 0 rows affected, 2 warnings (0.00 sec)
其次再在52主机上配置(51为主机)
mysql> change master to master_host='192.168.4.51', master_user='repl', master_password='123qqq...a', master_log_file='mysql_log_bin.000004', master_log_pos=1007; query ok, 0 rows affected, 2 warnings (0.01 sec)
启动并查看
mysql> start slave ; query ok, 0 rows affected (0.00 sec) mysql> show slave status\g ; *************************** 1. row *************************** slave_io_state: waiting for master to send event master_host: 192.168.4.52 master_user: repl master_port: 3306 connect_retry: 60 master_log_file: mysql_log_bin.000004 read_master_log_pos: 1007 relay_log_file: host51-relay-bin.000003 relay_log_pos: 324 relay_master_log_file: mysql_log_bin.000004 slave_io_running: yes slave_sql_running: yes replicate_do_db: replicate_ignore_db: replicate_do_table: replicate_ignore_table: replicate_wild_do_table: replicate_wild_ignore_table: last_errno: 0 last_error: skip_counter: 0 exec_master_log_pos: 1007 relay_log_space: 702 until_condition: none until_log_file: until_log_pos: 0 master_ssl_allowed: no master_ssl_ca_file: master_ssl_ca_path: master_ssl_cert: master_ssl_cipher: master_ssl_key: seconds_behind_master: 0 master_ssl_verify_server_cert: no last_io_errno: 0 last_io_error: last_sql_errno: 0 last_sql_error: replicate_ignore_server_ids: master_server_id: 52 master_uuid: 888f4a92-acd3-11f0-8b2a-000c29a32fbd master_info_file: /var/lib/mysql/master.info sql_delay: 0 sql_remaining_delay: null slave_sql_running_state: slave has read all relay log; waiting for more updates master_retry_count: 86400 master_bind: last_io_error_timestamp: last_sql_error_timestamp: master_ssl_crl: master_ssl_crlpath: retrieved_gtid_set: executed_gtid_set: auto_position: 0 replicate_rewrite_db: channel_name: master_tls_version: 1 row in set (0.00 sec)
只要slave_io_running: yes与slave_sql_running: yes都为yes即为同步成功
- slave_io_running: yes – io 线程正常(负责拉取主库binlog)
- slave_sql_running: yes– sql 线程正常(负责执行同步的 sql)
三、同步测试
在51主机上创建库表并插入数据
mysql> create database db1; query ok, 1 row affected (0.00 sec) mysql> create table db1.user(id int primary key auto_increments); query ok, 0 rows affected (0.01 sec) mysql> insert into db1.user values(1); query ok, 1 row affected (0.00 sec)
在52主机上查询是否数据同步
mysql> show databases; +--------------------+ | database | +--------------------+ | information_schema | | db1 | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> select * from db1.user; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
然后再在52主机上创建库表并插入数据
mysql> create database db2; query ok, 1 row affected (0.00 sec) mysql> create table db2.user(id int primary key auto_increments); query ok, 0 rows affected (0.01 sec) mysql> insert into db2.user values(2); query ok, 1 row affected (0.00 sec)
在51主机上查询是否数据同步
mysql> show databases; +--------------------+ | database | +--------------------+ | information_schema | | db1 | | db2 | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> select * from db2.user; +------+ | id | +------+ | 2 | +------+ 1 row in set (0.00 sec)
可看到两次数据的同步都成功了
至此互为主从配置成功数据同步成功!
总结
通过以上步骤我们完成了mysql的互为主从配置并实现数据同步。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论