MySQL数据库主从架构和基于amoeba的读写分离
1.MySQL数据库的主从架构安装配置
1.1架构图
1.2资源准备-虚机&安装包
hostname | ip | part | OS |
---|---|---|---|
node1 | 192.168.77.128 | master | centos7.6 |
node3 | 192.168.77.129 | slave | centos7.6 |
node2 | 192.168.77.130 | slave | centos7.6 |
MySQL数据库安装包名:为了简化实施耗时,这里直接yum安装了mariadb数据库。使用中可以使用MySQL数据库替换本文的mariadb。MySQL数据库安装办法请参考我的另外一篇文章:Linux下MySQL数据库安装
1.3实施安装
1.3.1主(master)节点(node1)安装配置
//node1作为主节点,ip为192.168.77.128
root@node1~$>systemctl stop firewalld
root@node1~$>systemctl disable firewalld
root@node1~$>setenforce 0
root@node1~$>yum -y install mariadb mariadb-devel mariadb-server
## 这里使用mariadb代替mysql
root@node1~$>vi /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-binlog
log-slave-updates=true
root@node1~$>systemctl start mariadb
root@node1~$>mysql -uroot
MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.77.%' identified by '123.com';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show master status;
+---------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| mysql-binlog.000003 | 709 | | |
+---------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> \q
1.3.2从(slave)节点(node2,node3)安装配置
//node2,node3是两个从节点,ip分别为192.168.77.130,192.168.77.129;这里只展示一台,另一台一样
root@node2~$>systemctl stop firewalld
root@node2~$>systemctl disable firewalld
root@node2~$>setenforce 0
root@node2~$>yum -y install mariadb mariadb-devel mariadb-server
## 这里使用mariadb代替mysql
root@node3~$>mysql -umyslave -p123.com -h192.168.77.128 ## 测试能不能连接到主库
MariaDB [(none)]> \q
root@node2~$>vi /etc/my.cnf
[mysqld]
server-id=2 //三台数据库的ID不能一致
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
root@node2~$>systemctl start mariadb
root@node2~$>mysql -uroot
MariaDB [(none)]> stop slave;
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.77.128',
-> MASTER_USER='myslave',
-> MASTER_PASSWORD='123.com',
-> MASTER_LOG_FILE='mysql-binlog.000003', ## 具体值对应主节点
-> MASTER_LOG_POS=709; ## 具体值对应主节点
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
1.4主从验证
主库创建数据
root@node1~$>mysql -uroot
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> create database haha;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| haha |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use haha;
Database changed
MariaDB [haha]> create table new(name char(20),phone char(20));
Query OK, 0 rows affected (0.01 sec)
MariaDB [haha]> show tables;
+----------------+
| Tables_in_haha |
+----------------+
| new |
+----------------+
1 row in set (0.00 sec)
从库验证
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| haha |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use haha;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [haha]> show tables;
+----------------+
| Tables_in_haha |
+----------------+
| new |
+----------------+
1 row in set (0.00 sec)
2.基于amoeba的读写分离
在实际生产环境中,如果对数据的读写都在一个数据库.上操作,无论安全性高可用还是高并发等各方面都不能满足实际需求,因此一般来说是通过主从复制的方式来同步数据,再通过读写分离来提升数据的高并发负载能力这样的方案进行部署。
简单来说读写分离就是在主服务器上写,只在从服务上读,基本的原理是让主数据库处理事务性查询,让从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
2.1拓扑图
or
### 2.2资源准备-虚机&安装包
hostname | ip | port | OS |
---|---|---|---|
node4 | 192.168.77.131 | amoeba | centos7.6 |
数据库使用上边提供的一主两从架构的数据库。
amoeba安装包名:amoeba-mysql-binary-2.2.0.tar.gz
jdk安装包名:jdk-6u31-linux-x64-rpm.bin
2.3实施安装配置
2.3.1安装jdk
在主机amoeba上安装java环境,因为amoeba是基于jdk1.5版本开发的,所以官方推荐用1.5或者1.6版本的jdk,高版本的不建议使用。
root@node4~$>chmod +x jdk-6u31-linux-x64-rpm.bin
root@node4~$>./jdk-6u31-linux-x64-rpm.bin
root@node4~$>vim /etc/profile.d/java.sh
root@node4~$>. /etc/profile.d/java.sh
root@node4~$>java -version
2.3.2安装配置amoeba
root@node4~$>yum -y install mariadb-devel mariadb
root@node4~$>mkdir -pv /usr/local/amoeba
root@node4~$>tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
root@node4~$>chmod -R 755 /usr/local/amoeba/
root@node4~$>cp /usr/local/amoeba/conf/dbServers.xml{,.bak}
root@node4~$>vim /usr/local/amoeba/conf/dbServers.xml
25 #行号 <!-- mysql user -->
#设置amoeba连接后端数据库服务器的账号,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接
26 <property name="user">amoeba</property>
27
#设置amoeba连接后端数据库的密码
29 <property name="password">123456</property>
#设置一个后端可写的dbServer,这里定义为master,这个名字可以任意命名,后面在amoeba.xml文件里会用到
45 <dbServer name="master" parent="abstractServer">
46 <factoryConfig>
47 <!-- mysql ip -->
#设置后端可写dbServer的ip
48 <property name="ipAddress">192.168.80.129</property>
49 </factoryConfig>
50 </dbServer>
51
#设置后端可读dbserver (如果是多个slave 从节点,这里就配置多个<dbServer ...</dbServer>,然后加入到后面第一的可读的组内)
52 <dbServer name="slave1" parent="abstractServer">
53 <factoryConfig>
#设置后端可读dbserver的ip
54 <property name="ipAddress">192.168.80.130</property>
55 </factoryConfig>
56 </dbServer>
57
58 <dbServer name="slave2" parent="abstractServer">
59 <factoryConfig>
60 <property name="ipAddress">192.168.80.131</property>
61 </factoryConfig>
62 </dbServer>
63
#设置定义一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为slaves
64 <dbServer name="slaves" virtual="true">
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
#选择调度算法,1表示复制均衡,2表示权重,3表示HA,这里选择1
67 <property name="loadbalance">1</property>
68
69 <!-- Separated by commas,such as: server1,server2,server1 -->
#myslave组成员
70 <property name="poolNames">slave1,slave2</property>
71 </poolConfig>
72 </dbServer>
73
74 </amoeba:dbServers>
root@node4~$>cp /usr/local/amoeba/conf/amoeba.xml{,.bak}
root@node4~$>vim /usr/local/amoeba/conf/amoeba.xml
30 <property name="user">amoeba</property>
31
32 <property name="password">123456</property>
#设置amoeba默认的池,这里设置为masterdb(这个是在dbServers.xml文件里定义的)
115 <property name="defaultPool">master</property>
116
#指定前面定义好的写池
117 <property name="writePool">master</property>
#在dbServers.xml文件里定义的读池
118 <property name="readPool">slaves</property>
119 <property name="needParse">true</property>
root@node4~$>/usr/local/amoeba/bin/amoeba start
#这台机器打开一个新的窗口
#连接amoeba的用户名,连接amoeba的密码,连接amoeba的地址,连接amoeba的端口
mysql -uamoeba -p123456 -h192.168.77.131 -P8066
2.3.3三台数据库给amoeba授权
MariaDB [(none)]> grant all on *.* to 'amoeba'@'192.168.77.%' identified by '123456';
# 用户名密码和配置amoeba时填写的用户名密码一致。
MariaDB [(none)]> flush privileges;
2.3.4验证
验证办法:停掉两台从库,然后各插入一组数据,在amoeba上查看表内容,多执行几次查看。然后在amoeba上插入一组数据,在三台数据库上分别查看
3.埋坑
1.不同步解决办法。
stop slave;
set global sql_slave_skip_counter=1;
start slave;
或者重新指定主服务器二进制文件名及ID值
2.如果当前操作的从库以前曾经与其他mysq| 服务器建立过主从关系,会发现即使现在my.cnf文件更改了主服务的位置,但是master仍然在试图连接旧的主服务器现象,发生这种问题,可以通过清除master.info 这个缓存文件或者在mysql中通过命令进行配置。
1.删除master.info文件,这个文件通常位于数据文件目录存放位置。
2.使用mysql命令。