`
leongod
  • 浏览: 63703 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql+myca搭建稳定高可用集群,负载均衡,主备复制,读写分离

 
阅读更多

数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境。

 

1、主要思路

简单说,实现mysql主备复制-->利用mycat实现负载均衡。

比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定。

 

2、测试环境

MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包。注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同。

linux实现思路类似,修改my.cnf即可。

1)A主mysql。192.168.110.1:3306, 用户root,密码root。操作系统:win7 x64,内存:4g

安装路径:C:\Program Files\MySQL\MySQL Server 5.5\bin

2)B备mysql。192.168.110.2:3306, 用户root,密码root。操作系统:win2003 x64,内存:1g

安装路径:C:\Program Files\MySQL\MySQL Server 5.5\bin

3)A主、B备的mysql中创建sync_test数据库。 

 

3、实现mysql主备复制

主要思路:A主mysql开启日志,B备mysql读取操作日志,同步执行。

一般为主备同步,主主同步不推荐使用。

 

3.1  配置A主mysql。

1)修改my.ini。需要在log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log"的相关位置创建log目录,以及mysql-bin.log文件。

[mysqld]
server-id=1 #主机标示,整数
port=3306    
log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log"  #确保此文件可写
read-only=0   #主机,读写都可以
binlog-do-db=sync_test   #需要备份数据库,多个写多行
binlog-ignore-db=mysql #不需要备份的数据库,多个写多行

2)允许MYSQL远程访问

 

#登录mysql console
进入%home%/bin,执行mysql -uroot -proot

#授权。允许root用户,从192.168.110.*的IP范围 远程访问A主mysql
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.110.*' IDENTIFIED BY 'root' WITH GRANT OPTION;

#生效。该操作很重要!!!
mysql>FLUSH PRIVILEGES;

 3)重启A主mysql数据库

进入%home%/bin,执行mysql -uroot -proot
mysql>net stop mysql;
mysql>net start mysql;

 4)查看主mysql日志状态

 

mysql> show master status\G;
*************************** 1. row ***************************
            File: mysql-bin.000003
        Position: 107
    Binlog_Do_DB: sync_test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)

ERROR:
No query specified

  

3.2  配置B备mysql

 1)修改my.ini。需要在log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log"的相关位置创建log目录,以及mysql-bin.log文件。

[mysqld]
# add for sycn test
server-id=2       				#从机标识
log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" #确保此文件可写
#master-host="192.168.110.1" #主机Ip
#master-user=root  				#数据库访问用户名
#master-pass=root 					#数据库访问密码
#master-port=3306          #主机端口
#master-connect-retry=60 	#如果从服务器发现主服务器断掉,重新连接的时间差(秒)
replicate-do-db=sync_test 	#只复制某个库
replicate-ignore-db=mysql 	#不复制某个库

2)重启B备mysql数据库

进入%home%/bin,执行mysql -uroot -proot
mysql>net stop mysql;
mysql>net start mysql;

3)配置B备数据库的数据来源,核实高亮处的状态是否正常。

 

mysql>change master to master_host='192.168.110.1',master_port='3306',master_user='root',master_password='root';
mysql>slave start;
mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send even
                  Master_Host: 192.168.110.1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 107
               Relay_Log_File: wjt-1c698d8a032-relay-bin.00001
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: sync_test
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 565
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

ERROR:
No query specified

 

3.3 验证同步配置结果。

1)A主mysql:使用navicat工具,在sync_test库中创建sync_table表,并添加一些数据。

 

2)B备mysql:使用navicat工具,查看sync_test库,可以看到sync_table表和数据已被同步。

 

 4、实现读写分离

主要思路:使用mycat中间件,转发sql指令到后端mysql节点。mycat不负责数据库同步。

 4.1 安装mycat

1)mycat是什么?可以认为它是一个数据库访问中间件,但更像f5、ngnix等产品,具备访问路由、多表分表分片操作等功能。总之很强大

下载:http://www.mycat.io/ ,本文使用的是:1.6-RELEASE

mycat使用java编写,因此可以有linux、windows等多个版本可下载。

2)解压Mycat-server-1.6-RELEASE-20161012170031-win.tar,到D:\dev-bin\mycat目录

3)确保java环境为jdk1.7以上,否则mycat将不支持。

4)安装完毕

 

4.2 配置mycat

1)server.xml。配置访问用户及权限。修改高亮处信息,其中admin、user为访问mycat的用户,TESTDB为mycat虚拟的数据库,供上层应用访问。

 

<user name="admin">
		<property name="password">admin</property>
		<property name="schemas">TESTDB</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>

 2)schema.xml。这部分不太好理解,精简了一下,主要分schema、dataNode、dataHost三个主要配置。

 

    <scheme>节点定义了mycat的虚拟数据库为TESTDB,    balance="1":write操作路由到A机,读操作路由到B。

 

 

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
		<!-- 这里不配置,代表所有的表分片到dn1节点-->
	</schema>

	<dataNode name="dn1" dataHost="localhost1" database="sync_test" />

	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="192.168.110.1:3306" user="root"  password="root">
			<!-- can have multi read hosts -->
			<readHost host="hostS2" url="192.168.110.2:3306" user="root" password="root" />
		</writeHost>
	</dataHost>
	
</mycat:schema>

 

 

4.3 启动mycat

1)启动mycat

 

D:\dev-bin\mycat\bin>startup_nowrap.bat

    后台信息如下:

 

 

D:\dev-bin\mycat\bin>startup_nowrap.bat

D:\dev-bin\mycat\bin>REM check JAVA_HOME & java

D:\dev-bin\mycat\bin>set "JAVA_CMD=C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java"

D:\dev-bin\mycat\bin>if "C:\Program Files (x86)\Java\jdk1.7.0_13" == "" goto noJavaHome

D:\dev-bin\mycat\bin>if exist "C:\Program Files (x86)\Java\jdk1.7.0_13\bin\java.exe" goto mainEntry

D:\dev-bin\mycat\bin>REM set HOME_DIR

D:\dev-bin\mycat\bin>set "CURR_DIR=D:\dev-bin\mycat\bin"

D:\dev-bin\mycat\bin>cd ..

D:\dev-bin\mycat>set "MYCAT_HOME=D:\dev-bin\mycat"

D:\dev-bin\mycat>cd D:\dev-bin\mycat\bin

#如果启动失败,请修改D:\dev-bin\mycat\bin\startup_nowrap.bat文件中的以下参数。默认占用内存为2G

 

 


 

 

D:\dev-bin\mycat\bin>"C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java" -server -Xms512m -Xmx512m -XX:MaxPermSize=64M  -XX:+AggressiveOpts -XX:MaxDirectMemorySize=768m -DMYCAT_HOME=D:\
p "..\conf;..\lib\*" io.mycat.MycatStartup
。。。。。。。。。。。。。。。。。。。。。。。。。。。
MyCAT Server startup successfully. see logs in logs/mycat.log   #启动成功将看到如下信息。

    如日志中出现192.168.110.2 not connected 等信息,请允许B备mysql远程访问。

 

#登录mysql console
进入%home%/bin,执行mysql -uroot -proot

#授权。允许root用户,从192.168.110.*的IP范围 远程访问Bmysql
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.110.*' IDENTIFIED BY 'root' WITH GRANT OPTION;

#生效。该操作很重要!!!
mysql>FLUSH PRIVILEGES;

 

4.4 测试读写分离。

1、验证是否同步

1)使用navicat连接mycat,操作方式和连接物理mysql库一致,用户admin,密码admin,端口8066。

2)在TESTDB虚拟库中,创建新表test2,增加一些数据

3)查看A节点、B节点数据已同步。

 

2、关闭B备mysql的同步,验证读写分离。

mysql> slave stop;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.110.1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 478
               Relay_Log_File: wjt-1c698d8a032-relay-bin.00001
                Relay_Log_Pos: 624
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: sync_test
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 478
              Relay_Log_Space: 936
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

ERROR:
No query specified

 

3)使用navicat连接mycat,操作方式和连接物理mysql库一致,用户admin,密码admin,端口8066。

a.连接成功后,将看到TESTDB数据库和test数据表。

b.在test表中添加一些数据,保存。

c.执行select * from test查看test操作,将看到数据未更新。

原因:mycat将查询sq路由到B,因此读取的结果集不一致。

 

最后,mycat使用可以参见官网的权威指南学习。双主双备架构待后续更新。 

 

 

 

0
2
分享到:
评论

相关推荐

    myca:MyCA - DIY HTTPS 证书

    MyCA是一个专为个人或小型组织设计的小型项目,旨在简化自签名证书的创建过程,让你可以构建自己的证书颁发机构(Certificate Authority, CA),实现DIY HTTPS证书。 项目背景: 在互联网上,HTTPS证书通常由受...

    MyCAT日常管理

    ### MyCAT日常管理知识点 ...以上命令为MyCAT日常管理和维护中常用的命令,通过这些命令可以有效地监控和调整MyCAT的服务状态,确保其稳定高效地运行。掌握这些命令对于MyCAT管理员来说至关重要。

    MyCA - Easy Self-Signed SSL:基于 PHP 的应用程序可在几秒钟内创建您自己的 CA 并签署 SSL 证书!-开源

    MyCA 是一个用 PHP 编写的非常简单的工具,它使用 phpseclib 库来创建证书颁发机构 (CA) 并使用它们签署 SSL 证书。 这个工具主要是为我自己编写的,因为我想要: 1. 一个免费的、基于 Web 的工具来创建和管理我的...

    catool:命令行实用程序,用于创建pki结构和签署证书

    sh$ catool create -cn myca.example.com -lt 1825 &gt; myca.pem # Creates our CA key and certificate (self-signed), pipes both to a file myca.pem. Sets lifetime to 5 years. sh$ catool create -...

    mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源

    mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat ...mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源myca

    docker-sslbump-proxy:Dockerfile构建Squid + c-icap SSL-Bump代理

    docker-sslbump-proxy 鱿鱼+ c-icap 底图 debian:最新 ... 文件路径:/usr/local/squid/myCA.der 或通常访问某些HTTPS网页和“信任证书”。 笔记 确保您的代理安全。 为防止不必要的使用,应使用防火墙或

    电子商务数字签名邮件教程.docx

    电子商务数字签名邮件教程 在电子商务领域中,数字签名邮件是一种重要的安全机制,能够确保电子邮件的真实性和完整性。下面是电子商务数字签名邮件教程的详细步骤: 第一步:安装数字证书 1. 打开网页 ...

    java_2868CA认证服务的方法和实现

    keytool -genkeypair -alias myCA -keyalg RSA -keysize 2048 -keystore myCAKeystore -validity 3650 ``` 2. **签署其他证书**:生成了CA证书后,我们可以使用它来签署用户的请求证书。KeyTool也提供签署证书的...

    OpenSSL证书制作过程

    CA在整个证书体系中扮演着极其重要的角色,通常建议企业自行搭建CA或者采用可信的第三方CA机构。 ##### 2.2 创建自签名CA 自签名CA是通过自己的私钥对自身信息进行签名产生的证书,主要用于测试环境。创建自签名CA...

    电子商务数字签名邮件经典教程.doc

    用户需要访问指定的网页(myca.cn),按照指示依次点击安装根证书,并在弹出的提示窗口中选择“是”或“确定”。之后,用户需要在注册页面填写电子邮件地址和辨识码进行注册,并确认通过邮箱接收到的身份识别码,以...

    My Certificate Authority shell-开源

    【标题】"My Certificate Authority shell...通过CHANGES、INSTALL、NOTES和myca等文件,用户不仅可以学习如何安装和使用该工具,还可以深入研究其内部机制,甚至参与到项目的开发中,为提升整个系统的安全性贡献力量。

    OpenSSL签名需要的文件

    在提供的压缩包文件 "MyCA" 中,可能包含了根CA的私钥、根CA证书、配置文件(openssl.cnf)、已签署的证书以及可能的CSR文件。这些文件是执行上述步骤所必需的,确保了整个签名过程的完整性和安全性。 了解这些概念...

    A few frequently used SSL commands

    - 添加证书链:`openssl pkcs12 -export -in MYCERT.crt -inkey MYKEY.key -out KEYSTORE.p12 -name "tomcat" -CAfile MY-CA-CERT.crt -caname myCA -chain` 11. **检查私钥** 使用`openssl rsa`命令检查私钥的...

Global site tag (gtag.js) - Google Analytics