MySQL讀寫分離
- 讀寫分離就是隻在主服務器上寫,只在從服務器上讀
- 主數據庫處理事務性查詢,從而數據庫處理select查詢
- 數據庫複製被用來把事務性查詢導致的變更同步到集羣中的從數據庫
案例實施 - 所有服務器關閉firewalld或者進行規則設置
- 搭建mysql主從複製環境
- Amoeba服務器環境安裝
配置amoeba讀寫分離,兩個slave讀負載均衡 - mysql1、mysql2和mysql3中執行以下操作開放權限給Amoeba
修改amoeba配置文件
/usr/local/amoeba/conf/amoeba.xml -
/usr/local/amoeba/conf/dbServers.xml
啓動Amoeba軟件
測試讀負載均衡
客戶機訪問數據庫
在數據庫db_test中創建zang,並自動同步到2臺從服務器
兩臺從服務器數據庫中關閉主從複製
分別在mysql1、mysql2、mysql3的zang表中上插入不同的數據
實操
在amoeba服務器上安裝amoeba需要先安裝jdk依賴包cp jdk-6u14-linux-x64.bin /usr/local
[root@amoeba abc]# cd /usr/local [root@amoeba local]# ls bin etc include lib libexec share tomcat9 boost_1_59_0 games jdk-6u14-linux-x64.bin lib64 sbin src [root@amoeba local]# ./jdk-6u14-linux-x64.bin //more,往下回車繼續看,直到讓你輸入yes Do you agree to the above license terms? [yes or no] yes Press Enter to continue..... Done
改個名字,便於管理
[root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6 [root@amoeba local]# ls bin etc include jdk-6u14-linux-x64.bin lib64 sbin src boost_1_59_0 games jdk1.6 lib libexec share tomcat9
優化環境變量
[root@amoeba local]# vim /etc/profile export JAVA_HOME=/usr/local/jdk1.6 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 local]# source /etc/profile [root@amoeba local]# echo $PATH /usr/local/jdk1.6/lib:/usr/local/jdk1.6/jre/bin/:/usr/java/jdk1.8.0_201-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/amoeba/bin
依賴包安裝完畢,接下來解壓amoeba源碼包
[root@amoeba local]# mkdir /usr/local/amoeba [root@amoeba local]# cd /abc [root@amoeba abc]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ [root@amoeba abc]# chmod -R 755 /usr/local/amoeba/ [root@amoeba abc]# /usr/local/amoeba/bin/amoeba amoeba start|stop
這個時候amoeba已經裝好了,接下來綁定三臺節點服務器,amoeba需要獲得相應的權限的賬號
對所有的數據庫進行配置mysql> grant all on *.* to test@'192.168.247.%' identified by '123.com'; Query OK, 0 rows affected (0.01 sec)
回到amoeba服務器繼續配置
[root@amoeba abc]# cd /usr/local/amoeba/ [root@amoeba amoeba]# vim conf/amoeba.xml 30 <property name="user">amoeba</property> //這裏是數據庫訪問amoeba服務器時使用的賬號 31 32 <property name="password">123123</property> //這裏是數據庫訪問amoeba服務器時使用賬號時用的密碼 115 <property name="defaultPool">master</property> 116 117 <!-- --> //取消下面的註釋符號-->,改到這裏 118 <property name="writePool">master</property> 119 <property name="readPool">slaves</property> 120 <property name="needParse">true</property>
設置服務器文件/usr/local/amoeba/conf/dbServers.xml
[root@amoeba amoeba]# cd conf/ [root@amoeba conf]# ls access_list.conf amoeba.xml dbServers.xml functionMap.xml log4j.xml ruleFunctionMap.xml amoeba.dtd dbserver.dtd function.dtd log4j.dtd rule.dtd rule.xml [root@amoeba conf]# vim dbServers.xml 25 <!-- mysql user --> 26 <property name="user">test</property> //這裏是amoeba訪問mysql時使用的賬號 27 28 <!-- mysql password --> 29 <property name="password">123.com</property> //這裏是amoeba訪問mysql時使用賬號的密碼 44 <dbServer name="master" parent="abstractServer"> 45 <factoryConfig> 46 <!-- mysql ip --> 47 <property name="ipAddress">192.168.247.160</property> 48 </factoryConfig> 49 </dbServer> 50 //上面6行是指定主服務器的地址 51 <dbServer name="slave1" parent="abstractServer"> 52 <factoryConfig> 53 <!-- mysql ip --> 54 <property name="ipAddress">192.168.247.161</property> 55 </factoryConfig> 56 </dbServer> 57 //上面6行是指定從服務器1的地址 58 <dbServer name="slave2" parent="abstractServer"> 59 <factoryConfig> 60 <!-- mysql ip --> 61 <property name="ipAddress">192.168.247.154</property> 62 </factoryConfig> 63 </dbServer> 64 //在原配置文件中,上面6行不存在,此處是由複製粘貼的得來,是指定從服務器2的地址 65 <dbServer name="slaves" virtual="true"> //此處設置從服務器地址池slaves 66 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> 67 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> 68 <property name="loadbalance">1</property> 69 70 <!-- Separated by commas,such as: server1,server2,server1 --> 71 <property name="poolNames">slave1,slave2</property> //此處填入從服務器名 72 </poolConfig> 73 </dbServer>
開啓amoeba服務
保存退出配置文件,開啓amoeba服務,因爲它內部有一個實時監控,持續性開啓,所以需要在後臺啓動,而且無法再進行命令操作,若想再對它進行操作,可以重新開啓一臺遠程,去連接
驗證[root@client ~]# systemctl stop firewall Failed to stop firewall.service: Unit firewall.service not loaded. [root@client ~]# setenforce 0 [root@client ~]# yum install mysql -y //安裝mysql去連接即可,client不需要安裝數據庫取存儲數據 [root@client ~]# mysql -u amoeba -p123123 -h 192.168.247.206 -P8066 //連接amoeba服務器 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 494299142 Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
此時先查看一下主服務器mysql中的數據庫,此時school中是沒有數據的
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | test | +--------------------+ 5 rows in set (0.01 sec) mysql> show tables; ERROR 1046 (3D000): No database selected mysql> use school; Database changed mysql> show tables; Empty set (0.00 sec)
回到鏈接到amoeba服務器的客戶端client,創建school數據庫
mysql> create table info (id int(4)not null primary key,name varchar(10) not null,score decimal(4,1) not null); //創建一個新表 Query OK, 0 rows affected (0.11 sec) mysql> desc info; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(4) | NO | PRI | NULL | | | name | varchar(10) | NO | | NULL | | | score | decimal(4,1) | NO | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.02 sec) mysql> use school; Database changed mysql> show tables; +------------------+ | Tables_in_school | +------------------+ | info | +------------------+ 1 row in set (0.00 sec)
下面就開始做讀寫分離實驗;
mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.247.160 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 900 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 772 Relay_Master_Log_File: master-bin.000001 ‘ Slave_IO_Running: No ’ Slave_SQL_Running: No Seconds_Behind_Master: NULL Master_Server_Id: 11 Master_UUID: e9a82741-3223-11ea-af25-000c29524d89 Master_Info_File: /home/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Master_Retry_Count: 86400 1 row in set (0.00 sec) mysql>
此時在客戶端寫如數據,然後到主服務器查看,發現寫入成功
mysql> select * from info; +----+----------+-------+ | id | name | score | +----+----------+-------+ | 1 | zhangsan | 88.0 | +----+----------+-------+ 1 row in set (0.00 sec)
在從服務器在此查看
mysql> select * from school.info; Empty set (0.00 sec) mysql>
由此可以發現讀寫已經分離,讀從服務器,寫主服務器
此時在從服務器1內寫入數據mysql> insert into info (id,name,score) values (2,'lisi',99); Query OK, 1 row affected (0.01 sec)
此時在從服務器2內寫入數據
mysql> insert into school.info (id,name,score) values (3,'wangwu',60); Query OK, 1 row affected (0.01 sec)
此時再到客戶端去讀取數據,可以發現實在輪流依次讀取兩臺從服務器上的數據
開啓同步後在此檢驗