浅谈Mysql簇

版权声明:
本文遵循“署名非商业性使用相同方式共享 2.5 中国大陆”协议
您可以自由复制、发行、展览、表演、放映、广播或通过信息网络传播本作品
您可以根据本作品演义自己的作品
您必须按照作者或者许可人指定的方式对作品进行署名。
您不得将本作品用于商业目的。
如果您改变、转换本作品或者以本作品为基础进行创作,您只能采用与本协议相同的许
可协议发布基于本作品的演绎作品。
对任何再使用或者发行,您都必须向他人清楚地展示本作品使用的许可协议条款。
如果得到著作权人的许可,您可以不受任何这些条件的限制。
                                                                                                                  asram
 
MySQL是一款非常流行的数据库软件。她是采用客户/服务器模型的开放源码关系型数据库管理系统。今天就来说说MySQL的一种技术--MySQL簇。MySQL簇是一种可以在分布式计算环境中使用的可冗余的内存数据库。MySQL簇采用了NDB簇存储引擎,该引擎具有高可用性和数据一致性好的特点。MySQL簇由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB 簇的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于簇中这些组件的关系,请参见下图:
p_w_picpath
 
所有这些程序一起构建了MySQL簇。将数据保存在NDB簇存储引擎中时,表将保存在数据节点内。能够从簇中所有其他MySQL服务器直接访问这些表。
     目前,MySQL簇的簇部分可以独立于MySQL服务器进行配置。在簇中,簇的每个部分都被视为1个节点。(注:在很多情况下,术语“节点”用于指计算机,但是在讨论MySQL簇时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语簇主机。)
     有三类簇节点,在最低的MySQL簇配置中,至少有三类节点,这三类节点分别是:
  1. 管理(MGM)节点:这类节点的作用是管理MySQL 簇内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM 节点是用命令ndb_mgmd启动的。
  2. 数据节点:这类节点用于保存簇的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4 个数据节点。没有必要有一个以上的副本。数据节点是用命令ndbd 启动的。
  3. SQL 节点:这是用来访问簇数据的节点。对于MySQL 簇,客户端节点是使用NDB 簇存储引擎的传统MySQL 服务器。典型情况下,SQL 节点是使用命令
    mysqld –ndbcluster 启动的,或将ndbcluster 添加到my.cnf 后使用mysqld启动。
簇配置包括对簇中单独节点的配置,以及设置节点之间的单独通信链路。对于目前设计的MySQL簇,其意图在于,从处理器的能力、内存空间和带宽来讲,存储节点是同质的,此外,为了提供单一的配置点,作为整体,簇的所有配置数据均位于1个配置文件中。
管理服务器(MGM节点)负责管理簇配置文件和簇日志。簇中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现有趣的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入簇日志。
此外,可以有任意数目的簇客户端进程或应用程序。它们分为两种类型:
· 标准MySQL客户端:对于MySQL簇,它们与标准的(非簇类)MySQL没有区别。换句话讲,能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL簇。
· 管理客户端:这类客户端与管理服务器相连,并提供了优雅地启动和停止节点、启动和停止消息跟踪(仅对调试版本)、显示节点版本和状态、启动和停止备份等的命令。
MySQL簇的使用
     安装下列包:
  1. MySQL-client-community。
  2. MySQL-server-community。
  3. MySQL-clusterstorage-community。
  4. MySQL-clustermanagement-community。
  5. MySQL-clustertools-community。
server1:192.168.102.19
server2:192.168.102.29
具体操作:
1。卸载每台服务器上的原有的MySQL
    # rpm -qa | grep mysql
    #rpm -e mysqlclientxxx
    #rpm -e mysql-xxxx
2。安装新版本MySQL服务端和客户端以及NDB引擎
    # rpm -ivh MySQL-Cluster-gpl-server-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-client-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-storage-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-management-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-tools-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-extra-6.3.20-0.rhel4.i386.rpm
    #cd /usr/bin
    #ln -fs /usr/sbin/ndbd /usr/bin
    #ln -fs /usr/sbin/ndb_mgmd /usr/bin
    #ln -fs /usr/sbin/ndb_cpcd /usr/bin
    #ln -fs /usr/sbin/mysqld /usr/bin
    #ln -fs /usr/sbin/mysqlmanager /usr/bin
    # mysql_install_db --user=mysql
mysql 安装后需要设置root用户的默认密码为mysql
命令为:mysqladmin -uroot -p password mysql
3.节点配置
    修改2台服务器的/etc/hosts文件
    192.168.102.19 db1
    192.168.102.29 db2
  • 配置管理节点配置文件:
    # cd /var/lib/mysql-cluster
    # vi config.ini
    在config.ini中添加如下内容:
    [ndbd default]
    NoOfReplicas= 2
    MaxNoOfConcurrentOperations= 10000
    DataMemory= 80M
    IndexMemory= 24M
    TimeBetweenWatchDogCheck= 30000
    DataDir= /var/lib/mysql-cluster
    MaxNoOfOrderedIndexes= 512
    StartPartialTimeout=100
    StartPartitionedTimeout=100
    ArbitrationTimeout=5000
    TransactionDeadlockDetectionTimeout=5000
    HeartbeatIntervalDbDb=5000
    StopOnError=0
    [ndb_mgmd default]
    DataDir= /var/lib/mysql-cluster
    [ndb_mgmd]
    Id=1
    HostName=db1---------------------------------------也可配成192.168.102.19
    [ndb_mgmd]
    Id=2
    HostName=db2---------------------------------------也可配成192.168.102.29
    [ndbd]
    Id= 3
    HostName=db1---------------------------------------也可配成192.168.102.19
    [ndbd]
    Id= 4
    HostName=db2---------------------------------------也可配成192.168.102.29
    [mysqld]
    ArbitrationRank=2 (非常重要,全靠有它,才可以形成仲裁竞争,从而当另一个机子当了时,此机还可以有知道partion完整的节点)
    [mysqld]
    ArbitrationRank=2
    [mysqld]-------------------------------------------------空出来以便恢复数据库用
    [mysqld]-------------------------------------------------空出来以便恢复数据库用
    [tcp default]
    PortNumber=63132
  • 配置通用my.cnf文件,mysqld及ndbd,ndb_mgmd均使用此文件.
    # vi /etc/my.cnf
    在my.cnf中添加如下内容:
    [mysqld]
    default-storage-engine=ndbcluster   避免在sql语句中还要加入ENGINE=NDBCLUSTER。
    ndbcluster 这个要加上,否则mysql会启动不了
    ndb-connectstring=db1,db2-----------------------------------------------也可配成192.168.102.19,192.168.102.29
    interactive_timeout=28800000
    wait_timeout=28800000
    log-bin---------------------------------------------------------------------------mysql增量备份用
    [ndbd]
    connect-string=db1,db2----------------------------------------------------也可配成192.168.102.19,192.168.102.29
    [ndb_mgm]
    connect-string=db1,db2----------------------------------------------------也可配成192.168. 102.19,192.168.102.29
    [ndb_mgmd]
    config-file=/var/lib/mysql-cluster/config.ini
    [mysql_cluster]
    ndb-connectstring=db1,db2------------------------------------------------也可配成192.168.102.19,192.168.102.29
    保存退出后。
  • 分别启动db1、db2的mysql服务:
    # service mysql start
    启动mysql之前一定要先保证ndbd和ndb_mgmd没有启动,否则会导致mysql启动不了
  • 启动管理节点Server1为:
    # ndb_mgmd --ndb_nodeid=1
    启动管理节点Server2为:
    # ndb_mgmd --ndb_nodeid=2
    注:在启动时有一个警告提示
    Cluster configuration warning:
       arbitrator with id 1 and db node with id 3 on same host 192.168.102.19
       arbitrator with id 2 and db node with id 4 on same host 192.168.102.29
       Running arbitrator on the same host as a database node may
       cause complete cluster shutdown in case of host failure.
    说节点1和3,2和4的arbitrator一样,可能引起整个集群失败。(可以不用放在心上)
  • 自动重启功能的添加:
    #chkconfig --add mysql
    #chkconfig --level 345 mysql on
    [root@mysql1 mysql]# vi /etc/rc.local
    ndb_mgmd -f /var/lib/mysql-cluster/config.ini
    ndbd
4。初始化MySQL簇
在db1中
# ndbd -- ndb_nodeid=3 --initial
在db2中
# ndbd -- ndb_nodeid =4 --initial
注:只有在第一次启动ndbd时或者对config.ini进行改动后才需要使用--initial参数!!!该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件。
5.检查运行情况
在db1上运行
# ndb_mgm –e show
Connected to Management Server at: 192.168.102.19:1186
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=3    @192.168.102.19  (mysql-5.1.30 ndb-6.3.20, Nodegroup: 0)
id=4    @192.168.102.29  (mysql-5.1.30 ndb-6.3.20, Nodegroup: 0, Master)
[ndb_mgmd(MGM)]    2 node(s)
id=1    @192.168.102.19  (mysql-5.1.30 ndb-6.3.20)
id=2    @192.168.102.29  (mysql-5.1.30 ndb-6.3.20)
[mysqld(API)]    4 node(s)
id=5    @192.168.102.29  (mysql-5.1.30 ndb-6.3.20)
id=6    @192.168.102.19  (mysql-5.1.30 ndb-6.3.20)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)
如果显示为上面的结果,说明你的集群配置已经成功完成了。
6。测试
在db1上使用MySQL客户端连接到服务器新建一个数据库和表,然后到db2上查看是否有此库和表。有就表示OK了。
7。备份和还原
1.备份
ndb_mgm的 "start backup" 参数就是用来备份的。只要我们写个脚本,建立好备份的目录,将脚本加入cron就可以了。例如:
#more /backup/mysql/mysqlcluster.sh
#/bi/bash
BakDir=/backup/mysql
LogFile=/backup/mysql/mysqlbak.log
echo " " >> $LogFile
echo " " >> $LogFile
echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
cd $BakDir
ndb_mgm -e "start backup"  >> $LogFile
备份后的目录应该大致如下:
clip_p_w_picpath002
日志内容大致如下:
p_w_picpath
2.还原
由于备份是分片备份在所有数据结点上,所以恢复操作就需要在所有的数据结点都进行恢复操作。
先在db1上执行:
 
#ndb_restore -n 3 -b 7 -r /var/lib/mysql-cluster/BACKUP/BACKUP-7/
(这里解释一下上面的语句:
ndb_restore -n ndb_nodeid -b back_id -r /var/lib/mysql-cluster/BACKUP/BACKUP- back_id /
ndb_nodeid可以通过运行命令ndb_mgm –e show)
clip_p_w_picpath002[5]
最后如下:
clip_p_w_picpath002[7]
还原完毕。
同理,以上操作需要在db2上重新做一遍。然后将2台服务器上的MySQL服务重新启动一下,这样2台服务器上的数据就同步了。
参考文献:
1.MySQL 5.1官方简体中文参考手册
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章