web架构 之 MySQL负载均衡 主从复制 读写分离

MySQL负载均衡架构图如下:




一、分别在192.168.150.130和192.168.150.131上安装mysql


二、配置master(192.168.150.130)
1、编辑/etc/my.cnf,添加如下(如etc没my.cnf,cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf)
log-bin=mysql-bin     #slave会基于此log-bin来做replication
server-id=1                #master的标识,说明是主数据库
binlog-do-db = mark #用于主从同步数据库


2、赋予权限给slave服务器的slave数据库
mysql> GRANT REPLICATION SLAVE ON *.* TO root@192.168.150.131 IDENTIFIED BY '111111';


3、重启mysql,使得配置生效
/usr/local/mysql/bin/mysqladmin shutdown
/usr/local/mysql/bin/mysqld_safe --user=mysql&   或
/usr/local/mysql/bin/safe_mysqld


4、查看master状态
mysql>show master status;


File                              Position    Binlog_Do_DB     Binlog_Ignore_DB
mysql-bin.000003           98              mark


三、配置slave(192.168.150.131)
1、编辑/etc/my.cnf,添加以下配置:(如etc没my.cnf,cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf)
server-id=2 #slave的标识


2、连接主数据库(master),并启动
mysql> stop slave;
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.150.130',
    -> MASTER_USER='root',
    -> MASTER_PASSWORD='111111',
    -> MASTER_LOG_FILE='mysql-bin.000003',
    -> MASTER_LOG_POS=98;
mysql> start slave;
mysql> show slave status\G   # 查看slave状态
其中MASTER_HOST是master机的ip,
MASTER_USER和MASTER_PASSWORD就是我们刚才在master上添加的用户,
MASTER_LOG_FILE和MASTER_LOG_POS对应与master status里的信息


3、如果出现类似字样,如
the server is not configured as slave。。。。
解决方案:
mysql> set global server_id = 2;


4、验证master-slave搭建生效
4.1、通过查看slave机的log(/var/log/mysqld.log 或 /usr/local/mysql/data/localhost.localdomain.err):
100703 10:51:42 [Note] Slave I/O thread: connected to master 'root@192.168.150.130:3306',  replication started in log 'mysql-bin.000003' at position 98
如看到以上信息则证明搭建成功,如果有问题也可通过此log找原因
4.2、在master
mysql>create database mark;
use mark;
create table emp(id int,name varchar(100));
4.3、在slave
mysql>create database mark;
use mark;
create table emp(id int,name varchar(100));
4.4、在master
insert into emp values(1,'mark1');
insert into emp values(2,'mark2');
select * from emp;
4.5、查看slave数据库
select * from emp;
与master数据一致表示同步成功!!


四、安装配置amoeba,实现负载均衡
1、amoeba是基于java运行的,所以要先装jdk


# chmod +x jdk-1_5_0_16-linux-i586-rpm.bin
# ./ jdk-1_5_0_16-linux-i586-rpm.bin
#  vi /etc/profile          //在文件里面添加jdk的环境变量,添加内容如下
 
JAVA_HOME=/usr/java/jdk1.5.0_16
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
 
# source  /etc/profile


2、安装amoeba,并配置(注意:我的amoeba装在192.168.150.130,因为内存不够,开不起三个虚拟机 T_T,所以amoeba和master数据库装在同一服务器上)
2.1、安装
tar -zxvf amoeba-mysql-1.2.1-GA.tar.gz
cp -vRp /root/amoeba-mysql-1.2.1-GA /usr/local/amoeba
2.2、配置
vi /usr/local/amoeba/conf/amoeba.xml
如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="gbk"?>  
  2.   
  3.   
  4. <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">  
  5. <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">  
  6.   
  7.   
  8. <server>  
  9. <!-- proxy server绑定的端口 -->  
  10. <property name="port">8006</property>  
  11.   
  12. <!-- proxy server绑定的IP -->  
  13. <!-- 
  14. <property name="ipAddress">192.168.150.130</property> 
  15. -->  
  16. <!-- proxy server net IO Read thread size -->  
  17. <property name="readThreadPoolSize">20</property>  
  18.   
  19. <!-- proxy server client process thread size -->  
  20. <property name="clientSideThreadPoolSize">30</property>  
  21.   
  22. <!-- mysql server data packet process thread size -->  
  23. <property name="serverSideThreadPoolSize">30</property>  
  24.   
  25. <!-- socket Send and receive BufferSize(unit:K)  -->  
  26. <property name="netBufferSize">128</property>  
  27.   
  28. <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->  
  29. <property name="tcpNoDelay">true</property>  
  30.   
  31. <!-- 对外验证的用户名 -->  
  32. <property name="user">root</property>  
  33.   
  34. <!-- 对外验证的密码 -->  
  35. <property name="password">root</property>  
  36.   
  37. <!-- query timeout( default: 60 second , TimeUnit:second) -->  
  38. <property name="queryTimeout">60</property>  
  39. </server>  
  40.   
  41. <!--   
  42. 每个ConnectionManager都将作为一个线程启动。  
  43. manager负责Connection IO读写/死亡检测  
  44. -->  
  45. <connectionManagerList>  
  46. <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">  
  47. <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>  
  48.   
  49. <!--   
  50.  default value is avaliable Processors   
  51. <property name="processors">5</property>  
  52. -->  
  53. </connectionManager>  
  54. </connectionManagerList>  
  55.   
  56. <dbServerList>  
  57. <!--   
  58. 一台mysqlServer 需要配置一个pool,  
  59. 如果多台 平等的mysql需要进行loadBalance,   
  60. 平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool  
  61. 简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig  
  62. 或者自己写一个ObjectPool。  
  63. -->  
  64. <dbServer name="server1">  
  65.   
  66. <!-- PoolableObjectFactory实现类 -->  
  67. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">  
  68. <property name="manager">defaultManager</property>  
  69.   
  70. <!-- 真实mysql数据库端口 -->  
  71. <property name="port">3306</property>  
  72.   
  73. <!-- 真实mysql数据库IP -->  
  74. <property name="ipAddress">192.168.150.130</property>  
  75. <property name="schema">mark</property>  
  76.   
  77. <!-- 用于登陆mysql的用户名 -->  
  78. <property name="user">master</property>  
  79.   
  80. <!-- 用于登陆mysql的密码 -->  
  81. <property name="password">master</property>  
  82.   
  83. </factoryConfig>  
  84.   
  85. <!-- ObjectPool实现类 -->  
  86. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">  
  87. <property name="maxActive">200</property>  
  88. <property name="maxIdle">200</property>  
  89. <property name="minIdle">10</property>  
  90. <property name="minEvictableIdleTimeMillis">600000</property>  
  91. <property name="timeBetweenEvictionRunsMillis">600000</property>  
  92. <property name="testOnBorrow">true</property>  
  93. <property name="testWhileIdle">true</property>  
  94. </poolConfig>  
  95. </dbServer>  
  96. <dbServer name="server2">  
  97.   
  98. <!-- PoolableObjectFactory实现类 -->  
  99. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">  
  100. <property name="manager">defaultManager</property>  
  101.   
  102. <!-- 真实mysql数据库端口 -->  
  103. <property name="port">3306</property>  
  104.   
  105. <!-- 真实mysql数据库IP -->  
  106. <property name="ipAddress">192.168.150.131</property>  
  107. <property name="schema">mark</property>  
  108.   
  109. <!-- 用于登陆mysql的用户名 -->  
  110. <property name="user">slave</property>  
  111.   
  112. <!-- 用于登陆mysql的密码 -->  
  113. <property name="password">slave</property>  
  114.   
  115.   
  116. </factoryConfig>  
  117.   
  118. <!-- ObjectPool实现类 -->  
  119. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">  
  120. <property name="maxActive">200</property>  
  121. <property name="maxIdle">200</property>  
  122. <property name="minIdle">10</property>  
  123. <property name="minEvictableIdleTimeMillis">600000</property>  
  124. <property name="timeBetweenEvictionRunsMillis">600000</property>  
  125. <property name="testOnBorrow">true</property>  
  126. <property name="testWhileIdle">true</property>  
  127. </poolConfig>  
  128. </dbServer>  
  129.   
  130. <dbServer name="multiPool" virtual="true">  
  131. <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">    
  132.   
  133. <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->  
  134. <property name="loadbalance">1</property>     
  135.   
  136. <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->  
  137. <property name="poolNames">server2</property>  
  138. </poolConfig>  
  139. </dbServer>  
  140. </dbServerList>  
  141.   
  142. <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">  
  143. <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>  
  144. <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>  
  145. <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>  
  146. <property name="LRUMapSize">1500</property>  
  147. <property name="defaultPool">server1</property>  
  148.   
  149. <property name="writePool">server1</property>  
  150. <property name="readPool">mutilPool</property>  
  151.   
  152. <property name="needParse">true</property>  
  153. </queryRouter>  
  154. </amoeba:configuration>  




2.3、赋予权限
主数据库,赋予权限
mysql>  grant all privileges on *.* to master@'192.168.150.130' identified by 'master';
从数据库,赋予权限
mysql>  grant all privileges on *.* to slave@'192.168.150.130' identified by 'slave';


2.4、重启amoeba
/usr/local/amoeba/bin/amoeba stop
/usr/local/amoeba/bin/amoeba start


2.5、测试
2.5.1、编辑amoeba_insert.php
<?php
$con = mysql_connect("192.168.150.130:8006","root","root");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }


mysql_select_db("mark", $con);


$r = mysql_query("INSERT INTO emp VALUES (999,'mark999')");


if($r>0){
echo "插入了";
}


mysql_close($con);


2.5.2、编辑amoeba_select.php
<?php
$con = mysql_connect("192.168.150.130:8006","root","root");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("mark", $con);


$result = mysql_query("select * from emp;");
while($row  = mysql_fetch_array($result)){


echo $row['id']."--".$row['name'];
echo '<br />';


}
mysql_close($con);


2.5.3、访问amoeba_insert.php和amoeba_select.php来测试




2.6、可能遇到的问题!!!!!!!
1、执行amoeba的命令,不够权限的话


方案1、chmod -R +x /usr/local/amoeba/bin/


2、遇到连接错误,如
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL  

Lost connection to MySQL server during query


方案1、赋予权限给新的用户
mysql> GRANT ALL PRIVILEGES ON *.* TO myuser@192.168.1.3 IDENTIFIED BY 'mypassword' 
方案2、防火墙问题
vi /etc/sysconfig/iptables ,添加如下
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火墙) 
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(允许3306端口通过防火墙)

重启网络 service network restart

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值