mysql主從復制及讀寫分離(附安裝包)
在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論在安全性、高可用性,還是高並發等各個方面都是完全不能滿足實際需求的,因此,一般需要通過主從復制(master-slave)的方式來同步數據,再通過讀寫分離提升數據庫的並發負載能力。
主從復制
(一)原理
復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。
(二)mysql支持的復制類型
(1)基於語句的復制: 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認采用基於語句的復制,效率比較高。一旦發現沒法精確復制時, 會自動選著基於行的復制。
(2)基於行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
(3)混合類型的復制: 默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。
(三)復制工作過程
(1) master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。復制過程有一個很重要的限制——復制在slave上是串行化的,也就是說master上的並行更新操作不能在slave上並行操作。
讀寫分離
(一)原理
簡單來說,讀寫分離就是只在主服務器上寫,只在從服務器上讀。基本原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫復制被用來把事務性查詢導致的變更同步到群集中的從數據庫中。
(二)讀寫分離工作過程
基於中間代理層實現:Mysql-Proxy Amoeba‘
實驗拓撲:
實驗環境:
主機 | 操作系統 | IP地址 | 主要軟件 |
---|---|---|---|
master | CentOS-7-x86_64 | 192.168.37.128 | mysql-5.5.24 |
slave1 | CentOS-7-x86_64 | 192.168.37.131 | mysql-5.5.24 |
slave2 | CentOS-7-x86_64 | 192.168.37.132 | mysql-5.5.24 |
amoeba | CentOS-7-x86_64 | 192.168.37.130 | jdk-6u14-linux-x64.bin ;amoeba-mysql-binary-2.2.0. |
client | CentOS-7-x86_64 | 192.168.37.130 | --- |
實驗安裝包:
鏈接:https://pan.baidu.com/s/1bHbR0fPzmVrZf5rGB3UNCA 密碼:8tho
實驗過程:
一、時間同步
主服務器:
1、安裝ntp,編輯配置文件
yum install ntp -y #如果已安裝忽略此步驟
vim /etc/ntp.conf #末尾添加
server 127.127.37.0 #本地是時鐘源
fudge 127.127.37.0 stratum 8 #設置時間層級為8/時鐘可以擴散8層
2、開啟服務
systemctl start ntpd.service #開啟服務
systemctl stop firewalld.service
setenforce 0
從服務器:
3、安裝ntp、ntpdate,開啟服務
yum install ntp ntpdate -y #如果已安裝忽略此步驟
systemctl start ntpd.service
systemctl stop firewalld.service
setenforce 0
4、開啟時間同步
/usr/sbin/ntpdate 192.168.37.128
二、主從復制
5、在三臺服務器上手工編譯安裝mysql5.5(操作過程概述如下)
//安裝環境
yum install gcc gcc-c++ make cmake ncurses-devel bison libaio-devel
//解壓安裝包
mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
tar zxvf /opt/abc/mysql-5.5.24.tar.gz -C /opt/
//編譯安裝
cd /opt/mysql-5.5.24
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/home/mysql/ \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_SSL=system \
-DMYSQL_TCP_PORT=3306 \
-DENABLE_DOWNLOADS=1 \
-DWITH_SSL=bundled
make && make install
//mysql配置文件復制
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 35 mysqld on
//環境變量設置
echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile
. /etc/profile #(註意:"."後面有空格)//創建管理用戶mysql
useradd -s /sbin/nologin mysql
chown -R mysql.mysql /usr/local/mysql
//數據初始化
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
//讓系統識別mysql
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
vi /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/home/mysql
//開啟服務
service mysqld start
6、主服務器:
//編輯配置文件
vim /etc/my.cnf
service mysqld restart
mysql
//給從服務器授權
mysql>grant replication slave on . to ‘myslave‘@‘192.168.37.%‘ identified by ‘123456‘; #授權給myslave用戶
#replication 復制
mysql>flush privileges; #刷新權限
mysql>show master status; #查看主服務器日誌文件
7、從服務器:
//編輯配置文件
vim /etc/my.cnf
service mysqld restart
註意:此處啟動失敗,可重新加載環境變量,或者查看進程是否被占用,重新啟動即可
mysql
//從服務器同步主服務器
slave1:
註意:指定主服務器(操作前查看主服務器日誌文件位置,會不斷變化)
change master to master_host=‘192.168.37.128‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000005‘,master_log_pos=107;
start slave; #開啟主從復制
show slave status \G; #看到兩個yes
slave2:
change master to master_host=‘192.168.37.128‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000005‘,master_log_pos=828;
start slave; #開啟主從復制
show slave status \G; #看到兩個yes
8、測試主從復制:主服務器上create database aaa,查看從服務器上是否存在數據庫aaa
三、Amoeba安裝(識別java語言)與配置
9、首先關閉防火墻
systemctl stop firewalld.service
setenforce 0
10、共享jdk安裝包,復制到/usr/local目錄下
mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
cd /opt/abc
cp jdk-6u14-linux-x64.bin /usr/local
11、執行jdk文件
./jdk-6u14-linux-x64.bin
12、使系統識別jdk文件,其工作目錄全部放到/usr/local下
mv jdk1.6.0_14/ /usr/local/jdk1.6
13、環境變量修改,系統可以運用安裝文件的命令
vim /etc/profile
source /etc/profile #刷新,使環境變量生效
14、安裝amoeba
mkdir /usr/local/amoeba #新建目錄
cd /opt/abc
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ #解壓安裝包到新建目錄下
chmod -R 755 /usr/local/amoeba/ #保證755權限
15、開啟amoeba
/usr/local/amoeba/bin/amoeba
16、在三臺服務器上添加權限,開放給amoeba訪問
mysql>grant all on . to test@‘192.168.37.%‘ identified by ‘123.com‘;
mysql>flush privileges;
17、配置代理服務器amoeba
vim /usr/local/amoeba/conf/amoeba.xml #配置文件
vim conf/dbServers.xml #數據庫配置文件
26行
<property name="user">"test"</property> 用test身份讀取mysql數據
29行
<property name="password">123.com</property>
42--主服務器地址
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.37.128</property>
50--從服務器
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.37.131</property>
64行--服務器池
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
18、開啟amoeba,查看端口
/usr/local/amoeba/bin/amoeba start&
netstat -ntap | grep java
四、客戶機測試(此處客戶機與amoeba同用一臺虛擬機)
19、簡易安裝mysql
yum install mysql -y
20、登錄mysql,進行如下操作
mysql -u amoeba -p123456 -h 192.168.37.130 -P8066
21、從服務器:(作測試使用,實際生產環境不會停掉)
stop slave;
主服務器:只負責寫入,amoeba讀不到
insert into info values(1,‘zhangsan‘,99);
slave1:
insert into info values(2,‘lisi‘,88);
slave2:
insert into info values(3,‘wangwu‘,77);
在客戶機查看:
至此,實驗已全部完成!
mysql主從復制及讀寫分離(附安裝包)