双主从复制

1.双主复制:实现和MHA相同的效果

使用keepalive实现双主热备,防止单点故障的主从结构。

两台mysql互做主从,各自安装keepalive实现热备,其他从服务器和热备的虚拟IP(vip)建立主从连接。

2.开启两台mysql,互相建立主从

前提:

db01: 192.168.8.5

db02: 192.168.8.6

db03: 192.168.8.7

如果接上节课的实验,则需要停止atlas和mha,以及slave

[root@slave2 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test stop

OK: MySQL-Proxy of test is stopped

[root@slave2 ~]# masterha_stop --conf=/etc/mha/app1.cnf

[root@slave2 ~]# mysql -u root -p

db03>stop slave;

db03>reset slave all;

Query OK, 0 rows affected (0.00 sec)

db02>stop slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

db02>reset slave all;

Query OK, 0 rows affected (0.00 sec)

有repl用户就可以:

db02>select user,host from mysql.user;

+---------------+-------------+

| user          | host        |

+---------------+-------------+

| mha           | 192.168.8.% |

| repl          | 192.168.8.% |

| mysql.session | localhost   |

| mysql.sys     | localhost   |

| root          | localhost   |

+---------------+-------------+

5 rows in set (0.00 sec)

(1)修改配置文件

主库db01:

cat > /etc/my.cnf <<EOF

[mysqld]

basedir=/usr/local/mysql/

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

server_id=1

port=3306

secure-file-priv=/tmp

autocommit=1

log_bin=mysql-bin

binlog_format=row

gtid-mode=on

enforce-gtid-consistency=true

log-slave-updates=1

[mysql]

prompt=db01>

EOF

slave1(db02):

cat > /etc/my.cnf <<EOF

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

server_id=2

port=3306

secure-file-priv=/tmp

autocommit=1

log_bin=mysql-bin

binlog_format=row

gtid-mode=on

enforce-gtid-consistency=true

log-slave-updates=1

[mysql]

prompt=db02>

EOF

slave2(db03):

cat > /etc/my.cnf <<EOF

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

server_id=3

port=3306

secure-file-priv=/tmp

autocommit=1

log_bin=mysql-bin

binlog_format=row

gtid-mode=on

enforce-gtid-consistency=true

log-slave-updates=1

[mysql]

prompt=db03>

EOF

(3) 启动数据库

systemctl restart mysqld

在第一台mysql创建复制用户

mysql1:

grant replication slave on *.* to repl@'192.168.8.%' identified by '123';

在第二台mysql建立和第一台的主从关系

change master to

master_host='192.168.8.5',

master_user='repl',

master_port=3306,

master_password='123' ,

MASTER_AUTO_POSITION=1;

start slave;

在第一台mysql再建立和第二台的主从关系

change master to

master_host='192.168.8.6',

master_user='repl',

master_port=3306,

master_password='123' ,

MASTER_AUTO_POSITION=1;

start slave;

mysql1、mysql2:

show slave status \G

3.两台服务器安装keepalived

wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

yum -y install keepalived

4.配置mysql1的keepalived

vim /etc/keepalived/keepalived.conf

修改为:

global_defs {

   router_id mysql1

}

vrrp_instance VI_1 {

    state MASTER

    interface ens33

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.8.254

    }

}

virtual_server 192.168.8.254 3306 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    persistence_timeout 50

    protocol TCP

    real_server 192.168.8.5 3306 {

        weight 1

        TCP_CHECK {

                connect_port 3306

                connect_timeout 3

                retry 3

                delay_before_retry 3

}

}

}

保存退出

启动:systemctl start keepalived

5.配置mysql2的keepalived

vim /etc/keepalived/keepalived.conf

修改为:

global_defs {

   router_id mysql2

}

vrrp_instance VI_1 {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.8.254

    }

}

virtual_server 192.168.8.254 3306 {

    delay_loop 6   每隔6秒进行一次健康检查

    lb_algo rr

    lb_kind DR

    persistence_timeout 50

    protocol TCP

    real_server 192.168.8.6 3306 {

        weight 1

        TCP_CHECK {

                connect_port 3306

                connect_timeout 3

                retry 3

                delay_before_retry 3

}

}

}

保存退出

启动:systemctl start keepalived

6.两台服务器查看虚拟IP

ip a show dev ens33

(第一台有漂移地址,第二台没有漂移地址)

登录测试:

[root@mysql ~]# mysql -umha -pmha -h192.168.8.254 -P 3306

db01>

在第一台创建数据库,第二台可以学习到

db02>show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| db1                |

| haha               |

| mysql              |

| performance_schema |

| sys                |

| test               |

+--------------------+

7 rows in set (0.01 sec)

7.开启第三台mysql,与虚拟IP建立主从

change master to

master_host='192.168.8.254',

master_user='repl',

master_port=3306,

master_password='123' ,

MASTER_AUTO_POSITION=1;

start slave;

show slave status \G

注:如果其他主机ping 192.168.8.254可能会不通,第三个从服务器也无法建立主从;

    keepalived切换几遍,再尝试ping。

### MySQL双向主从复制配置教程、原理及问题解决 #### 1. 双向主从复制的原理 MySQL双向主从复制是一种特殊的主从复制形式,其中两台MySQL服务器互为主从。这意味着每台服务器既是主服务器(Master),又是从服务器(Slave)。数据在两个服务器之间同步,形成双向的数据流动。这种架构通常用于实现高可用性和负载均衡[^1]。 在双向主从复制中,需要确保以下几点: - 每台服务器都有唯一的`server-id`。 - 避免循环更新问题,即一个服务器接收到的数据更新再次被发送回原服务器。这通常通过设置`log-slave-updates`和`replicate-ignore-db`参数来解决[^3]。 #### 2. 双向主从复制的配置步骤 以下是配置MySQL双向主从复制的基本步骤: ##### 主服务器配置 在两台服务器上分别执行以下操作: ```sql [mysqld] server-id=1 # 在另一台服务器上设置为2 log-bin=mysql-bin binlog-do-db=testdb # 同步的数据库名称 binlog-ignore-db=mysql # 忽略mysql系统数据库 ``` ##### 创建复制用户 在两台服务器上创建用于复制的用户: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` ##### 配置主从关系 在两台服务器上分别执行以下命令以配置主从关系: ```sql CHANGE MASTER TO MASTER_HOST='192.168.1.101', # 对方服务器的IP地址 MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', # 对方服务器的二进制日志文件名 MASTER_LOG_POS=123; # 对方服务器的二进制日志位置 START SLAVE; ``` ##### 验证主从同步 在两台服务器上分别执行以下命令以验证主从同步是否正常: ```sql SHOW SLAVE STATUS\G; ``` 检查`Slave_IO_Running`和`Slave_SQL_Running`是否均为`Yes`。 #### 3. 常见问题及解决方法 以下是配置过程中可能出现的问题及解决方法: - **问题:循环更新导致死锁** 解决方法:在两台服务器上启用`log-slave-updates`并设置`replicate-ignore-db`参数,避免重复更新[^1]。 - **问题:主从不同步** 解决方法:检查`SHOW SLAVE STATUS`输出中的错误信息,并根据提示修复。常见原因包括网络连接中断、权限不足或日志文件丢失[^4]。 - **问题:数据一致性问题** 解决方法:使用`pt-table-checksum`工具检查主从数据一致性,并使用`pt-table-sync`工具修复不一致的数据[^3]。 #### 4. 双向主从复制的优势与劣势 **优势**: - 提高系统的可用性,当一台服务器故障时,另一台服务器可以继续提供服务。 - 实现读写分离,减轻单台服务器的压力。 **劣势**: - 配置复杂度较高,容易出现循环更新等问题。 - 数据一致性维护成本较高,尤其是在高并发场景下。 #### 5. 使用一键部署工具简化配置 如果希望简化配置过程,可以使用类似PanguHA的一键部署工具[^2]。这些工具能够自动完成大部分配置工作,减少手动操作带来的错误风险。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值