搭建MySql主從復制與讀寫分離
?mysql主從復制讀寫分離
二、實驗目的:?
?熟悉mysql主從復制的原理
?熟悉mysql讀寫分離的原理
?學會配置mysql主從復制
?學會配置mysql讀寫分離
三、實驗環境:?
主機 操作系統 IP地址 主要軟件
Master CentOS 6.5 x86_64 /linux6.5 192.168.1.101 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Slave1 CentOS 6.5 x86_64 /linux6.5 192.168.1.102 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Slave2 CentOS 6.5 x86_64 /linux6.5 192.168.1.103 cmake-2.8.6.tar.gz
Amoeba CentOS 6.5 x86_64 /linux6.5 192.168.1.110 amoeba-mysql-binary-2.2.0.tar.gz
jdk-6u14-linux-x64.bin
客戶端 CentOS 6.5 x86_64 /linux6.5 192.168.1.111
註:將所需軟件拷貝至/usr/src中
四:實驗思路:
1.安裝mysql
2.配置mysql的主從復制
3.配置mysql的讀寫分離
實驗過程
一:網絡環境的部署(本步驟每個機器都要設置)
1:按照圖表設置每臺服務器的ip地址
2:配置主機yum(每個系統都要設置)
[root@localhost yum.repos.d]# rm -rf CentOS-Base.repo
[root@localhost yum.repos.d]# vi CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/
gpgcheck=1
enabled=1
gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-6
[root@localhost yum.repos.d]# cd
[root@localhost ~]# mount /dev/cdrom /media/cdrom
二:搭建Mysql主從復制
將所需軟件拷貝到/usr/src/目錄下
1:在mysql主服務器上建立時間同步服務器
[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vi /etc/ntp.conf
添加:
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@localhost ~]# service ntpd restart
[root@localhost ~]# service iptables stop
[root@localhost ~]# chkconfig iptables off
2:在從服務器上進行時間同步
[root@localhost yum.repos.d]# yum -y install ntpdate
[root@localhost yum.repos.d]# /usr/sbin/ntpdate 192.168.1.101
[root@localhost yum.repos.d]# service iptables stop
[root@localhost yum.repos.d]# chkconfig iptables off
3:在三個服務器上安裝mysql(master,slave都有)
[root@localhost ~]# yum -y install ncurses-devel
註釋:
ncurses是字符終端下屏幕控制的基本庫
[root@localhost ~]#yum -y install gcc*
[root@localhost ~]# cd /usr/src
[root@localhost src]# tar zxvf cmake-2.8.6.tar.gz
[root@localhost src]# cd cmake-2.8.6
[root@localhost cmake-2.8.6]# ./configure
[root@localhost cmake-2.8.6]#gmake
[root@localhost cmake-2.8.6]#gmake install
[root@localhost cmake-2.8.6]# cd /usr/src
[root@localhost src]# tar zxvf mysql-5.5.22.tar.gz
[root@localhost mysql-5.5.22]# cd mysql-5.5.22
[root@localhost mysql-5.5.22]#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
註釋:
-DCMAKE_INSTALL_PREFIX= 安裝根目錄
-DDEFAULT_CHARSET= 默認字符集
-DDEFAULT_COLLATION=默認編碼
-DWITH_EXTRA_CHARSETS= 額外的編碼,請使用ALL來編譯。
-DWITH_MYISAM_STORAGE_ENGINE=1 編譯myisam存儲引擎,默認的存儲引擎,不加也可以
-DWITH_INNOBASE_STORAGE_ENGINE=1 支持InnoDB存儲引擎,這個也是默認安裝的
-DWITH_READLINE=1 使用readline功能
-DENABLED_LOCAL_INFILE=1 可以使用load data infile命令從本地導入文件
-DMYSQL_DATADIR=數據庫 數據目錄
-DSYSCONFDIR= 指定主配置文件目錄
[root@localhost mysql-5.5.22]# make && make install
4:優化調整(master,slave都有)
[root@localhost mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf
cp:是否覆蓋"/etc/my.cnf"? y
[root@localhost mysql-5.5.22]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.5.22]# chmod +x /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.5.22]# chkconfig --add mysqld
[root@localhost mysql-5.5.22]# echo "PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
[root@localhost mysql-5.5.22]# . /etc/profile \點後面有個空格
5:初始化數據庫(master,slave都有)
[root@localhost mysql-5.5.22]# groupadd mysql
[root@localhost mysql-5.5.22]# useradd -M -s /sbin/nologin mysql -g mysql
[root@localhost mysql-5.5.22]# chown -R mysql:mysql /usr/local/mysql
[root@localhost mysql-5.5.22]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
[root@localhost mysql-5.5.22]# service mysqld start
[root@localhost mysql-5.5.22]# chkconfig mysqld on
[root@localhost mysql-5.5.22]# mysqladmin -u root password ‘pwd123‘
6:配置mysql master主服務器(在master上)
[root@localhost mysql-5.5.22]# vi /etc/my.cnf
添加並修改:
server-id=11 \修改,57行
log-bin=master-bin \修改,49行
log-slave-updates=true \添加 (可不用添加)
註釋:
系統默認采用基於語句的復制類型
1:基於語句的復制。 在主服務器上執行的 SQL 語句,在從服務器上執行同樣的語句。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對服務器上的表所進行的更新之間的沖突,配置:binlog_format = STATEMENT
2:基於行的復制。把改變的內容復制過去,而不是把命令在從服務器上執行一遍,從 MySQL 5.0開始支持,配置:binlog_format = ROW
3:混合類型的復制。默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制,配置:binlog_format = MIXED
log_slave_updates=true #Slave可以是其他 Slave 的 Master,從而擴散 Master 的更新
binlog-ignore-db=test #不記錄指定的數據庫的二進制日誌
replicate-ignore-db=test #設置不需要同步的庫
binlog_cache_size = 1M #日誌緩存的大小
expire_logs_days=3 #自動過期清理日誌的天數
以上參數在[mysqld]模塊中設置
[root@localhost mysql-5.5.22]# service mysqld restart
7:給從服務器授權(在master上)
[root@localhost mysql-5.5.22]# cd
[root@localhost ~]# mysql -u root -p
輸入密碼pwd123
mysql> grant replication slave on . to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘ ;
mysql> flush privileges;
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 337 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
8:配置從服務器(在slave上配置)
[root@localhost mysql-5.5.22]# vi /etc/my.cnf
修改並添加
server-id = 22 \修改,57行值不能和其他mysql服務器重復
relay-log=relay-log-bin \添加(可不指定)
relay-log-index=slave-relay-bin.index \添加(可不指定)
註釋:
--relay-log=name????中繼日誌的文件的名字
?--relay-log-index=name??????MySQL slave 在啟動時需要檢查relay log index 文件中的relay log信息,此處定義該索引文件的名字
[root@localhost mysql-5.5.22]# service mysqld restart
9:登陸從服務器配置同步(在slave上)
[root@localhost mysql-5.5.22]# mysql -u root -p
輸入密碼
mysql> change master to master_host=‘192.168.1.101‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=337; \紅色的是用主服務器中show出來的值,337表示偏移量
註:?Slave?的?IO?線程接收到信息後,將接收到的日誌內容依次寫入到?Slave?端的Relay?Log文件(relay-log-bin.xxxxxx)的最末端,並將讀取到的Master端的master-bin的文件名和位置記錄到master-?info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個master-bin的哪個位置開始往後的日誌內容,請發給我
mysql> start slave;
mysql> show slave status\G;
確保下列兩項是yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
10:驗證主從復制效果
mysql> show databases; \查看當前的數據庫,在從服務器上
mysql> create database db_test; \創建一個數據庫,在主服務器上
mysql> show databases; \查看當前的數據庫,在從服務器上發現多了一個剛創建的數據庫
如果需要將一個slave1服務器作為另一臺slave2的master,
1):在slave1上修改my.cnf,在[mysqld]模塊添加log-slave-updates=true字段,並重啟mysql
2):在slave1上執行以下命令創建一個授權用戶,用於在slave2上鏈接slave1
mysql> grant replication slave on . to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘ ;
mysql> flush privileges;
mysql> show master status;
3):show出來的信息做為slave2上連接slave1時的參數
重啟Mysql服務不會影響主從關系
三:搭建mysql讀寫分離
1:在主機amoeba上安裝java環境
把java拷貝到/usr/local目錄下
[root@localhost ~]# chmod +x /usr/local/jdk-6u14-linux-x64.bin
[root@localhost ~]# cd /usr/local
[root@localhost local]# ./jdk-6u14-linux-x64.bin
[root@localhost local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@localhost local]# vi /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@localhost local]# source /etc/profile
[root@localhost local]# java -version \查詢版本,確定java安裝成功
2:安裝並配置amoeba
將amoeba軟件拷貝到usr/src目錄中
[root@localhost local]# mkdir /usr/local/amoeba
[root@localhost local]# cd /usr/src
[root@localhost src]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost src]# chmod -R 755 /usr/local/amoeba/
[root@localhost src]# /usr/local/amoeba/bin/amoeba
amoeba start|stop \有此提示表示成功
3:配置amoeba讀寫分離
(1)在三個mysql服務器中開放權限給amoeba訪問
mysql> grant all on . to test@‘192.168.10.%‘ identified by ‘123.com‘; \三個mysql服務器都要
(2)在amoeba上配置amoeba.xml文件
[root@localhost amoeba]# service iptables stop
[root@localhost ~]# cd /usr/local/amoeba/conf
[root@localhost conf]# vi amoeba.xml
修改紅色部分
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">amoeba</property> \\30行
<property name="password">123456</property> \\32行
<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>
。。。。。。。。略。。。。。。。
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property> \115行
<property name="writePool">master</property> \\118行
<property name="readPool">slaves</property> \\119行此處的註釋去掉
<property name="needParse">true</property>
</queryRouter>
[root@localhost conf]# vi dbServers.xml
修改(註意去掉註釋),slave2的復制一個slave1
搭建MySql主從復制與讀寫分離