mysql 主从复制读写分离实现 0 mysql主从复制 0i>>CvAl} (一)安装mysql(主从服务器皆相同) 先创建用户 useradd mysql -s /sbin/nologin Gm[XnUR7V P]0/ S tar zxvf mysql-5.0.45.tar.gz #2dH2k\F cd mysql-5.0.45 6Zx)L|B ./configure --prefix=/usr/local/mysql --localstatedir=/opt/data --with-extra-charsets=utf8,gb2312,gbk --with-pthread --enable-thread-safe-client sdBB( 注:配置过程指定数据文件的位置及另加的字符集. f&I5bPS7} make 629ogJo8 make install "XLFw;o cp support-files/my-large.cnf /etc/my.cnf 1nR\m+{ cd /usr/local/mysql v+~O\v5Q chgrp -R mysql . E/2_@&U:} 生成基本的数据库和表: /usr/local/mysql/bin/mysql_install_db --user=mysql AEd9H
+I 成功执行后察看数据目录/opt/data,看是否有文件或目录生成. EGzlRSgO chown -R mysql:mysql /opt/data >J_(~{-sNG 记得给每个数据库设置root密码. t{e}3}LEd (二)修改配置文件 ))6YOc 不同的地方就是server-id,主服务器配置文件不用修改,从服务器的配置文件server-id=10.其他的内容基本相同. U
U3o (Yq (三)启动服务 U^kk0OT^ /usr/local/mysql/bin/mysqld_safe --user=mysql& O f]/tdPp 这个过程主辅服务器都相同. +o]J0Gu (四)授权(在主服务器上进行) q}C;~nMD GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.8.100 identified by 'mylqs'; ^fP5@T*f (五)查询主数据库状态(主服务器上进行) $XcuU
sG mysql> show master status; }[y_Fr0 +------------------+----------+--------------+------------------+ jxZ_-1 | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | 2LS91 +------------------+----------+--------------+------------------+ 2BO"mc<#$ | mysql-bin.000003 | 235 | | | s0'6r$xj +------------------+----------+--------------+------------------+ SmV}Wf 记下file及position的值,后面做从服务器操作的时候需要用. xu@+b~C\ (六)配置从服务器 X.AE>fx*h mysql> change master to master_host='192.168.8.101', master_user='rep1', master_password='mysql', master_log_file='mysql-bin.000003', master_log_pos=235; \^dYmU 正确执行后再执行: T3t
w.yh mysql> start slave; "Mh}n-oju 就启用了复制功能.这里我们运行一下 mysql> show slave status\G 来检查一下,一个正常的输出结果应该如下面的形式: !T.yv5ge' mysql> show slave status\G V]/$ dJ *************************** 1. row *************************** R#Z
m[S Slave_IO_State: Waiting for master to send event vb$i00? Master_Host: 192.168.8.101 A",R2d Master_User: rep1 ,D' bIk Master_Port: 3306 AbB+<0 Connect_Retry: 60 G%T<wKD< Master_Log_File: mysql-bin.000003 [@0Hmd7 Read_Master_Log_Pos: 235 rfOrh^ Relay_Log_File: -relay-bin.000009 {<Xl57w-Q Relay_Log_Pos: 235 Q7_#k66gb7 Relay_Master_Log_File: mysql-bin.000003 ;W3c|5CE Slave_IO_Running: Yes a lyA#zao| Slave_SQL_Running: Yes /p)y!5e Replicate_Do_DB: VVc-Dx Replicate_Ignore_DB: T5aeO^x Replicate_Do_Table: l>pnY%(A Replicate_Ignore_Table: p%5(Qqmlk Replicate_Wild_Do_Table: WB" 90! Replicate_Wild_Ignore_Table: qR^+K@*| Last_Errno: 0 W1[C/dDc Last_Error: @XH@i+{B Skip_Counter: 0 Olr'n% } Exec_Master_Log_Pos: 235 Cil1wFBb Relay_Log_Space: 235 Zrq\:KxX Until_Condition: None |q 0iX2W Until_Log_File: }5y]kn Until_Log_Pos: 0 cFoeyI# v Master_SSL_Allowed: No ;z9U_ Master_SSL_CA_File: p:Zhg{sF Master_SSL_CA_Path: !8o;~PPVl Master_SSL_Cert: qhNYQ/uS Master_SSL_Cipher: m"vWu0/# Master_SSL_Key: j8?rMD~ Seconds_Behind_Master: 0 Edl .R}&1 1 row in set (0.00 sec) t,qz%J&a 0|~3\e/QV 请注意:slave_IO进程及slave_SQL进程都必须正常运行,在状态输出重表现为: Slave_IO_Running: Yes 及Slave_SQL_Running: Yes 否则都是不正确的状态(如一个值Yes,另外一个是NO则不行). C oO0~q (七)主数据库有数据的情况: <s5s<q2 1、数据库锁表操作,不让数据再进行写入动作。mysql> FLUSH TABLES WITH READ LOCK; KOD%>+vG$ 2、察看主数据库的状态 mysql> show master status; 照第(五)步记录输出值。 qZX\riR 3、把主服务器数据文件复制到从服务器,最好先用tar处理一下。 ./}W3 4、取消主数据库锁定 mysql> UNLOCK TABLES; ASaNac-3 5、从服务器的操作。跟前面的步骤一样(略过) <*DP G\6Ma e `Tssa+ mysql代理安装配置 \> p}h9>R 一、安装mysql-proxy.需要按下列顺序安装其所依赖的包: (?~*.g! (一)安装LUA *@[+C~U tar zxvf lua-5.1.tar.gz SgY\h{{sP cd lua-5.1 2R`}}4<Z 用vi修改Makefile,使"INSTALL_TOP=/usr/local/lua",这样做的目的是为了是lua的所有文件都安装在目录/usr/local/lua/ t`vIcCXqyl make posix &BQ%df<y\ make install [^A>hs* |%5nV=&\ (二)安装 libevent -LEpT$v| tar zxvf libevent-1.1a.tar.gz - x]gp5 cd libevent-1.1a S$Fq1 ./configure --prefix=/usr/local/libevent pn4~?Aua0/ make g+M& _n make install K!_''Fg t+Hx&_pMj (三)安装check ^ l9NF tar zxvf check-0.8.4.tar.gz y`.m'n7>P cd check-0.8.4 {]dH+J7 ./configure vP{;'R make 1PjqXgN5p make install '7TT4~F 3eP7vy (四)设置安装mysql-proxy所需的环境变量.把下面的内容追加到/etc/profile中 wQ/Z: export LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm" F otHITw[ export CPPFLAGS="-I/usr/local/libevent/include" :T# "bY export CFLAGS="-I/usr/local/libevent/include" Jsp>v'Qvq 然后执行 source /etc/profile (安装完mysql-proxy不再需要这些变量,可以删除之) [*AWCV Wg
?P" (五)安装mysql(只安装mysql客户端即可) B!zqvShF tar zxvf mysql-5.0.45.tar.gz yCG<qQz cd mysql-5.0.45 |=W=H6h* ./configure --prefix=/usr/local/mysql --without-server J=C63YB make aj)?P make install , %%}d9 =j{r95)|u (六)安装mysql-proxy c/\$AJV.H tar zxvf mysql-proxy-0.5.0.tar.gz u t4+c0 cd mysql-proxy-0.5.0 ZT'Sw%U: ./configure –prefix=/usr/local/mysql-proxy --with-mysql=/usr/local/mysql --with-lua Qo;#}%}^^ Make J\ V.J/ Make install Ud8*yB ~1yMw.04V 二、主要的命令行选项 11Hf)]M
--help-all显示所有的帮助选项 {k}EWV --admin-address=host:port 管理主机及端口,默认是4041 Y4B<]C4 --proxy-address=host:port 代理服务器的监听地址及端口,默认4040 XN=Cq*3} --proxy-read-only-address=host:port 只读连接时,代理服务器的监听地址及端口。默认4042 *(4TasQu --proxy-backend-addresses=host:port连接真实服务器的地址及监听端口,默认是3306,这是mysql代理最重要的选项,多个主机之间用空格隔开。使用rr算法。 Iu -CXc --proxy-lua-script=file 指定lua脚本的名称 GK/Q]}Q8pZ 3oCw(Ff 三、 使用方法 ;5.o;|w?! 2个mysql服务器的情形 n6a*|rE mysql-proxy \ dWI.t1`i --proxy-backend-addresses=mysql_ip1:3306 \ yeCR{{B/' --proxy-backend-addresses=mysql_ip2:3306 cc%O35o 4#qjRmt 3个服务器的情形:一个主服务器,负责写入;2个从服务器,负责查询。 Bn"r;pqWiT mysql-proxy --proxy-backend-addresses=<master_ip> :3306\ a#0GmK --proxy-read-only-address=<slave_ip1>:3306 \ &E{5k{Y --proxy-read-only-address=<slave_ip2>:3306 PSdH9ea O^]I>A#d / -=(51}E 四、mysql-proxy启动 :{9|/a 编写脚本/usr/local/bin/mysql-proxy.sh其内容如下: K;f'&9-+i, #!/bin/bash G5Ci"0 LUA_PATH="/usr/local/mysql-proxy/share/mysql-proxy/?.lua" mysql-proxy --proxy-read-only-backend-addresses=192.168.1.38:3306 --proxy- eh'mSf^=p backend-addresses=192.168.1.33:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua >> /var/log/mysql-proxy.log & a{h(BI^~ chmod 755 /usr/local/bin/mysql-proxy.sh; 执行命令/usr/local/bin/mysql-proxy.sh启动服务 K]bS:[34 R B-[SUmHr $/C<^}A 配置验证 #{0DpSzE5 1、主从复制测试:在主数据库服务器上创建库和表,然后再插入记录,再登陆到从服务器,看是否也建立相一致的库和表以及记录。 Snt=Hil` mysql> create database first_db; u,F d[[t Query OK, 1 row affected (0.01 sec) }bznx[4?I 在主数据库服务器创建库first_db FbM5Bqv ]@J}f}Mjo mysql> create table first_tb(id int(3),name char(10)); fnnwe2aso Query OK, 0 rows affected (0.00 sec) +$>ut
r 在主数据库服务器创建表first_db QBsDO].J< `^J~^Z7Y- mysql> insert into first_tb values (001,'myself'); &`L5UX Query OK, 1 row affected (0.00 sec) vB4cdW
2#3 在主数据服务器的表first_db中插入记录 Ql*/{#$ mFF]d 现在转到从数据库服务器,看是否同步了上面主数据库的数据 N~>?w#?J mysql> show databases; c0G/irK +--------------------+ sf*SxdoZU | Database | LVEVCpp@ +--------------------+ .hJ8K#r | information_schema | 8e\v5K9 | first_db | $m=z87hX | mysql | <dYk|5AdLF | test | j=AJs< +--------------------+ |%V.Lae 4 rows in set (0.01 sec) >rFvT>@NU 数据库自动生成了 n#&RY%#` ?@#}%<yEq mysql> use first_db; &"kx(B Database changed ,){0y%c#y mysql> show tables; aXJe"IT.u +--------------------+ UA8!?r-cR | Tables_in_first_db | !xc7~D@om( +--------------------+ *=7[Ip<X | first_tb | "QF083$ +--------------------+ @ubz?5 1 row in set (0.00 sec) []]3"n 表也自动生成了 E nvs[YZe _)l %-*Z7p mysql> select * from first_tb; r9Z/y*q +------+--------+ $aA.d^ | id | name | tAA7 +------+--------+ EDo@J2A | 1 | myself | x]ti3?w +------+--------+ ]1&9~TL 1 row in set (0.00 sec) #I?iR3u 记录也按照我们的意愿存在了 [tzSr=,Cg gxOmbQt@; 2、读写分离:用mysql客户端程序如mysql登陆到mysql代理,然后执行读写操作,以测试读写分离的正确性。 JC"K{V{
|