mysql集群安装配置

一、什么是MySQL集群

   MySQL集群是一个无共享的(shared-nothing)、分布式节点架构的存储方案,其目的是提供容错性和高性能。

   数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。

   无共享的对等节点使得某台服务器上的更新操作在其他服务器上立即可见。传播更新使用一种复杂的通信机制,这一机制专用来提供跨网络的高吞吐量。

   通过多个MySQL服务器分配负载,从而最大程序地达到高性能,通过在不同位置存储数据保证高可用性和冗余。

二、架构图



三、如何存储数据

1.Mysqlcluster数据节点组内主从同步采用的是同步复制,来保证组内节点数据的一致性。一般通过两阶段提交 协议来实现,一般工作过程如下:

a)Master执行提交语句时,事务被发送到slave,slave开始准备事务的提交。
b)每个slave都要准备事务,然后向master发送OK(或ABORT)消息,表明事务已经准备好(或者无法准备该事务)。
c)Master等待所有Slave发送OK或ABORT消息

      如果Master收到所有 Slave的OK消息,它就会向所有Slave发送提交消息,告诉Slave提交该事务;

      如果Master收到来自任何一个Slave的ABORT消息,它就向所有 Slave发送ABORT消息,告诉Slave去中止事务。

e)每个Slave等待来自Master的OK或ABORT消息。

         如果Slave收到提交请求,它们就会提交事务,并向Master发送事务已提交 的确认;

         如果Slave收到取消请求,它们就会撤销所有改变并释放所占有的资源,从而中止事务,然后向Masterv送事务已中止的确认。

f)      当Master收到来自所有Slave的确认后,就会报告该事务被提交(或中止),然后继续进行下一个事务处理。

由于同步复制一共需要4次消息传递,故mysql  cluster的数据更新速度比单机mysql要慢。所以mysql cluster要求运行在千兆以上的局域网内,节点可以采用双网卡,节点组之间采用直连方式。


疑问: 对cluster进行扩容增加数据节点组时会不       会导致数据更新速度降低?

答:不会,数据更新速度会变快。因为数据是分别处理,每个节点组所保存的数据是不一样的,
也能减少锁定。

2.Mysqlcluster将所有的索引列都保存在主存中,其他非索引列可以存储在内存中或者通过建立表空间存储到磁盘上。如果数据发生改变(insert,update,delete等),mysql 集群将发生改变的记录写入重做日志,然后通过检查点定期将数据定入磁盘。由于重做日志是异步提交的,所以故障期间可能有少量事务丢失。为了减少事务丢失,mysql集群实现延迟写入(默认延迟两秒,可配置),这样就可以在故障发生时完成检查点写入,而不会丢失最后一个检查点。一般单个数据节点故障不会导致任何数据丢失,因为集群内部采用同步数据复制。

四、MySQL集群的横向扩展

1.添加数据节点组来扩展写操作,提高 cluster的存储能力。支持在线扩容,先将新的节点加入到clsuter里,启动后用
ALTER ONLINE TABLE table_name REORGANIZE PARTITION

  命令进行数据迁移,把数据平均分配到数据节点上。

2.添加Slave仅仅扩展读,而不能做到写操作的横向扩展。

整个系统的平均负载可以描述为:

AverageLoad=∑readload+ ∑writeload / ∑capacity

假设每个服务器每秒有10000的事务量,而Master每秒的写负载为4000个事务,每秒的读负载为6000,结果就是:

AverageLoad=6000+4000/10000=100%

现在,添加3个slave,每秒的事务量增加到40000。因为写操作也会被复制,每个写操作执行4次,这样每个slave的写负载就是每秒4000个事务。那么现在的平均负载为:

AverageLoad=6000+4*4000/ 4*10000=55%

五、 MySQL 集群的优缺点

优点:

a)  99.999%的高可用性

b)快速的自动失效切换
c)灵活的分布式体系结构,没有单点故障
d)高吞吐量和低延迟
e)可扩展性强,支持在线扩容

缺点:

a)存在很多限制,比如:不支持外键
b)部署、管理、配置很复杂
c)占用磁盘空间大,内存大
d)备份和恢复不方便
e)重启的时候,数据节点将数据load到内存需要很长时间


看网上很多人说mysql集群不是很稳定,因此这2天做了下mysql的集群,打算配置没有什么问题了,过2天做下相关的性能测试,我的配置环境如下:
 
操作系统:
     Centos5.2
  
软件包:
     mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
 
数据库管理节点: 192.168.100.151
数据库数据节点: 192.168.100.65,192.168.100.58
数据库sql节点: 192.168.100.65,192.168.100.58
 
我这里数据节点和sql节点用相同的2台机器承担.
 
1.管理节点的安装
  #groupadd mysql
  #useradd mysql -g mysql
  #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz /usr/local/
  #cd /usr/local/
  #tar zxvf mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
  #rm -f mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
  #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23 mysql
  #chown -R mysql:mysql mysql
  #cd mysql
  #scripts/mysql_install_db --user=mysql
 
2.管理节点的配置
  #mkdir /var/lib/mysql-cluster
  #cd /var/lib/mysql-cluster
  #vi config.ini                 //这里需要手动添加如下内容
 
   [ndbd default]
  NoOfReplicas=2
  DataMemory=80M
  IndexMemory=18M                  
//这里有很多参数,大家可以自己找下相关资料
  [ndb_mgmd]
  Id=1
  Hostname=10.10.1.151             //管理节点IP
  datadir=/usr/local/mysql/logs
  [ndbd]
  Id=2
  Hostname=10.10.1.65              //数据节点IP   
  datadir=/usr/local/mysql/data/   
//数据节点的数据目录,这里要与数据节点的配置文件my.cnf
                                     的数据指定相同
  [ndbd]
  Id=3
  Hostname=10.10.1.58            //数据节点IP   
  datadir=/usr/local/mysql/data/
  [MYSQLD]
  [MYSQLD]
 
3.安装和配置数据节点
 
  这里2台机器数据节点安装是相同的.
  #groupadd mysql
  #useradd mysql -g mysql
  #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz /usr/local/
  #cd /usr/local/
  #tar zxvf mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
  #rm -f mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
  #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23 mysql
  #chown -R mysql:mysql mysql
  #cd mysql
  #scripts/mysql_install_db --user=mysql
  #cp support-files/my-medium.cnf /etc/my.cnf
  #cp support-files/mysql.server /etc/init.d/mysqld
  #vi /etc/my.cnf          //这里需要手动添加如下的内容
 
  datadir=/usr/local/mysql/data/       //这里要与管理节点的config.ini相同
  ndbcluster
  ndb-connectstring=10.10.1.151
  [ndbd]
  connect-string=10.10.1.151
  [mysql_cluster]
  ndb-connectstring=10.10.1.151
  [ndb_mgm]
  connect-string=192.168.1.151
  [ndb_mgmd]
  config-file=/var/lib/mysql-cluster/config.ini 
 //这里要指定管理节点配置文件路径
 
4.启动相关服务
 
   在管理节点启动相关服务:
  #/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
  #netstat -lntpu
  tcp        0      0 0.0.0.0:1186            0.0.0.0:*                
  LISTEN   22907/ndb_mgmd
  
  看到1186端口开放了说明启动是正常的.
 
  在数据节点启动相关服务:
  #/usr/local/mysql/bin/ndbd --initial
  #netstat -lntpu
  tcp        0      0 10.10.1.65:32975            0.0.0.0:*                    LISTEN      1901/ndbd                  
tcp        0      0 10.10.1.65:32976            0.0.0.0:*                   LISTEN      1901/ndbd           
tcp        0      0 10.10.1.65:32977            0.0.0.0:*                   LISTEN      1901/ndbd  
 
#service mysqld start
#netstat -lntpu
tcp        0      0 :::3306                     :::*                        LISTEN      2258/mysqld 
 
可以看到相关的ndbd服务以及mysql已经启动ok了.
 
5.功能测试
 
  到管理节点查看下相关服务状态
 # ndb_mgm
 ndb_mgm> show
 Connected to Management Server at: localhost:1186
 Cluster Configuration
 ---------------------
 [ndbd(NDB)]     2 node(s)
 id=2    @10.10.1.65  (mysql-5.1.37 ndb-7.0.8, Nodegroup: 0, Master)
 id=3    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8, Nodegroup: 0)
 [ndb_mgmd(MGM)] 1 node(s)
 id=1    @10.10.1.151  (mysql-5.1.37 ndb-7.0.8)
 [mysqld(API)]   2 node(s)
 id=4    @10.10.1.65  (mysql-5.1.37 ndb-7.0.8)
 id=5    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8)
 
 可以看到这里的数据节点、管理节点、sql节点都是正常的.
 
 现在我们在其中一个数据节点上进行相关数据库的创建,然后到另外一个数据节点上看看数据是否同步
 
 # /usr/local/mysql/bin/mysql -u root -p
 mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| ndb_2_fs           | 
| test               | 
+--------------------+
mysql> create database aa;
mysql> use aa
mysql> CREATE TABLE ctest2 (i INT) ENGINE=NDB;  //这里必须指定数据库表的引擎为NDB,否则同
                                                 步失败
mysql> INSERT INTO ctest2 () VALUES (1);
mysql> SELECT * FROM ctest2;
+------+
| i    |
+------+
|    1 | 
+------+
 
现在到另外一个数据节点查看下aa数据库是否同步过来了.
 
#/usr/local/mysql/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| aa                 | 
| bb                 | 
| mysql              | 
| ndb_3_fs           | 
| test               | 
+--------------------+
mysql> use aa
mysql> select * from ctest2;
+------+
| i    |
+------+
|    1 | 
+------+
 
从上面可以看到数据已经同步了,mysql集群环境已经搭建完成.
 
6.破坏性测试
  
  大家在上面可以看到10.10.1.65作为主的数据节点,我现在把10.10.1.65这台机器关闭,看下有什么结果
  ndb_mgm> show
  Cluster Configuration
  ---------------------
  [ndbd(NDB)]     2 node(s)
  id=2 (not connected, accepting connect from 10.10.1.65)
  id=3    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8, Nodegroup: 0, Master)
  [ndb_mgmd(MGM)] 1 node(s)
  id=1    @10.10.1.151  (mysql-5.1.37 ndb-7.0.8)
  [mysqld(API)]   2 node(s)
  id=4 (not connected, accepting connect from any host)
  id=5    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8)
 
  从上面可以发现现在10.10.1.65这台机器的数据节点和sql节点已经连接不上了,10.10.1.58成为了主数
  据节点,我们现在在10.10.1.58数据节点上创建一个表,然后恢复10.10.1.65的数据节点,看下它是否
  把数据同步过来了.
 
  先在10.10.1.58数据节点做如下操作:
  mysql> create table ctest3(id int(11)) engine=NDB;
  mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest2       | 
| ctest3       | 
+--------------+
mysql> insert into ctest3 values(1);
mysql> select * from ctest3;
+------+
| id   |
+------+
|    1 | 
+------+
 
然后我们恢复10.10.1.65数据节点,查看下ctest3数据是否同步过来了.
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| aa                 | 
| bb                 | 
| mysql              | 
| ndb_2_fs           | 
| test               | 
+--------------------+
mysql> use aa
mysql> show tables; 
+--------------+
| Tables_in_aa |
+--------------+
| ctest        | 
| ctest2       | 
| ctest3       | 
+--------------+
mysql> select * from ctest3;
+------+
| id   |
+------+
|    1 | 
+------+
 
可以看到10.10.1.65数据节点已经把10.10.1.58数据节点的数据同步过来了,说明mysql集群是没有问题的了.随后做下mysql性能相关的测试.
 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值