1、配置主主复制的作用和特点
1)作用
对数据库实现高可用
2)mysql主从复制的特点
避免单点故障
防止数据丢失
添加访问并发量
2、mysql主从复制的类型
1)基于语句的复制(默认)
主myql服务器上执行的语句,从服务器同步执行
2)基于行的复制
把改变的内容复制到从服务器
3)混合类型的复制
一旦发现基于语句无法精准复制时,就会采用基于行的复制
3、安装配置ntp服务
1)安装ntp服务
[root@master01 /]# yum -y install ntp (四台同时安装)
2)配置ntp服务
[root@master01 /]# systemctl restart ntpd
[root@master01 /]# systemctl enable ntpd
restrict 192.168.200.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@master02 ~]# ntpdate 192.168.200.10 将四台服务器的时间都同步了
如图所示:
4、修改主配置文件并重启
vim /etc/my.cnf
1)master01
[mysqld]
server-id = 10 数据库的ID号
log-bin = mysql-bin 开启二进制日志功能
log-slave-updates = true 允许从服务器更新数据
relay-log = relay-log-bin 数据库事件的单独编号文件
relay-log-index = relay-log-bin.index 记录relay-log-bin日志位置
数据库data目录下的文件作用:
auto.cnf 记录mysql数据库实例的server_uuid,安装的时候初始化,master和slave的server_uuid不能一样
ibdata innodb表空间,如果采用innodb引擎,会默认10M大小
ib_logfile 事务日志文件,是确保事务的REDO和UNDO,主要是确保事务的前滚和后滚,不能用来恢复
master02.err 当前数据库的错误日志
master02.pid 当亲数据库运行的id号,用于锁
master.info 主从同步保存的信息
mysql-bin mysql二进制日志位置
mysql-bin.index 二进制日志文件索引,存放二进制日志文件列表
performance_schema 系统数据库目录
2)master02
[mysqld]
server-id = 20
log-bin = mysql-bin
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
3)slave01
[mysqld]
server-id = 30
log-bin = mysql-bin
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
4)slave02
[mysqld]
server-id = 40
log-bin = mysql-bin
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
5)分别启动这四台mysql服务器
[root@master01 /]# systemctl restart mysqld
6)数据库中的数据不一致时的操作(基本上以数据最多的为主,在其他数据库中导入这台数据库的所有数据)
mysql> flush tables with read lock; 施加锁,在数据多的一台上配置
mysqldump -uroot -p --opt --all-databases > /root/all-databases.sql 最好另起一个ssh终端,输入此命令,防止锁失效
scp /root/all-databases.sql root@192.168.200.20:/root/ 将数据传输到其他节点上
mysql -uroot -p < /root/all-databases.sql 将传输过来的数据导入数据库中
mysql -uroot -ppwd@123 -e "flush privileges;" 在其他节点上刷新配置
mysql> unlock tables; 若是正在使用的环境中最好是配置完主主或主从复制后在解锁
5、配置主主复制和主从复制
1)主主复制
[root@master01 /]# mysql -uroot -ppwd@123
mysql> grant replication slave on *.* to 'tongbu'@'192.168.200.%' identified by 'pwd@123'; 授权所有服务器复制master01二进制日志的权限
mysql> show master status; 查看master01的日志状态
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; 在master02中配置
mysql> statr slave; 启动master02的slave
[root@master02 /]# mysql -uroot -ppwd@123
mysql> grant replication slave on *.* to 'tongbu'@'192.168.200.%' identified by 'pwd@123'; 授权所有服务器复制master02二进制日志的权限
mysql> show master status; 查看master02的日志状态
mysql> change master to master_host='192.168.200.20',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; 在master01中配置
mysql> statr slave; 启动master01的slave
2)主从复制
[root@slave01 /]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; Slave01中配置
mysql> statr slave; 启动slave01的slave
[root@slave02 /]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; Slave02中配置
mysql> statr slave; 启动slave02的slave
3)若出现配置错误需要使用如下命令后在重新配置:
mysql> stop slave; 停止服务
mysql> reset slave; 重置服务
4)检查四台数据库的状态(ip地址,Slave_IO_Running: Yes,Slave_SQL_Running: Yes)
6、配置读写分离
1.安装jdk和amoeba。
1)配置JDK。
[root@amoeba ~]# mkdir /usr/local/jdk
[root@amoeba /]# cp /usr/src/jdk-6u14-linux-x64.bin /usr/local
[root@amoeba local]# ./jdk-6u14-linux-x64.bin
[root@amoeba local]# mv ./jdk1.6.0_14/* ./jdk
2)安装amoeba。
[root@amoeba jdk]# mkdir /usr/local/amoeba
[root@amoeba jdk]# mv /usr/src/conf/* /usr/local/amoeba
3)配置环境变量。
[root@amoeba /]# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba /]# source /etc/profile
[root@amoeba local]# java -version
2.设置amoeba读写分离账户。
1)设置主mysql允许test账户访问mysql,需要在主从上同时配置。
[root@master /]# mysql -uroot -p
mysql> grant all on . to ‘amoeba’@‘192.168.100.50’ identified by ‘pwd@123’;
2)修改amoeba配置文件配置客户端访问amoeba的账户密码。
[root@amoeba /]# vim /usr/local/amoeba/amoeba.xml
10 <property name="port">8066</property> 客户端访问amoeba的端口
30 <property name="user">client</property> 访问amoeba的账户
32 <property name="password">pwd@123</property> 访问amoeba账户的密码
115 <property name="defaultPool">master</property> 默认写mysql池的名字
116 <property name="writePool">master</property> 写入MySQL数据库的池
117 <property name="readPool">slaves</property> 读取MySQL数据库的池
3)设置amoeba服务器的host文件,添加解析主机名。(在群集中所有的服务器上配置,也可配置DNS,或不配置在后面需要用ip地址)
[root@amoeba /]# vim /etc/hosts
192.168.100.10 master01
192.168.100.20 master02
192.168.100.30 slave01
192.168.100.40 slave02
192.168.100.50 amoeba
4)修改amoeba的配置文件添加服务器池。
[root@amoeba /]# vim /usr/local/amoeba/dbServers.xml
26 <property name="user">amoeba</property>
27 <property name="password">pwd@123</property>
42 <dbServer name="master" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">192.168.100.10</property>
46 </factoryConfig>
47 </dbServer>
49 <dbServer name="slave01" parent="abstractServer">
50 <factoryConfig>
51 <!-- mysql ip -->
52 <property name="ipAddress">192.168.100.30</property>
53 </factoryConfig>
54 </dbServer>
56 <dbServer name="slave02" parent="abstractServer">
57 <factoryConfig>
58 <!-- mysql ip -->
59 <property name="ipAddress">192.168.100.40</property>
60 </factoryConfig>
61 </dbServer>
64 <dbServer name="slaves" virtual="true">
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN(轮询) , 2=WEIGHTBASED(权重) , 3=HA-->
66 <property name="loadbalance">1</property>
67 <property name="poolNames">slave01,slave02</property>
68 </poolConfig>
69 </dbServer>
5)启动amoeba。
[root@amoeba /]# amoeba start&
[root@amoeba /]# netstat -anptu | grep 8066
[root@amoeba /]# netstat -anptu | grep java
6)客户端登录到数据库。
[root@Centos ~]# mysql -u client -p -h 192.168.100.50 -P 8066