目前,LAMP、LNMP是两套非常流行的开源Linux Web服务搭建方式。以免费高效著称,是很多网站和Web系统的首选服务器架构。
业务数据往往是很宝贵的资源,业务数据的损坏和丢失,对企业来讲是一个重大损失。因此,对业务数据做实时的备份和恢复显得尤为重要。
在LAMP平台和LNMP平台上,数据的存储主要是存储在MySql数据库上。MySql从3.23.15版本开始,提供了主从同步复制机制,通过复制机制,可以达到数据实时备份的目的。同时,还可以使用该技术,进行数据读写分离,提高效率。因此,在常规情况下,一般是一台Web,3台DB。
可能你有充足的资金预算,可以购买3台DB服务器来满足业务需要,也可能资金预算不足,只能买两台DB服务器甚至一台DB服务器。那么,必然会有一台服务器运行至少两个数据库示例。
本文重点讲述如何在一台Linux服务器上快速部署多个MySql数据库实例。软件情况如下:
1.操作系统:RedHat Linux 5.4 Enterprise
2.MySql版本:MySql-5.1.44
下面开始吧。
1.获得MySql编译好的二进制程序文件及相关配置文件
获得编译好的二进制程序文件有三种方式,第一种是直接在MySql的官方网站下载编译好的二进制版本,第二种是在已经安装好MySql数据库的服务器上提取,第三种,就是下载源代码包自己编译,得到编译后的二进制版本。
本文采用的是第二种方式,从已经安装好的MySql服务器上提取编译过的MySql文件(安装采用的是源代码本机编译形式安装)。
提取方法:
1.1登录MySql服务器,获取MySql安装路径。可以在mysql控制台下,使用如下指令获取到安装路径:
show variables like '%basedir%';
查询结果如下:
从上图可以看出,我们的MySql是安装在/usr/local/mysql/目录下的。得到了mysql的安装路径,就可以开始MySql文件的提取操作了。
1.2登录到安装mysql的linux服务器上,进入mysql的安装目录。我们需要进入的目录是:/usr/local/。
使用指令如下:
cd /usr/local
操作结果如下:
可以使用pwd指令,查看当前所在的目录位置。操作指令如下:
pwd
操作结果如下:
可以看出,我们当前是在/usr/local目录。现在我们看看目录下的文件夹及文件情况。使用指令如下(两个小写的L字母):
ll
操作结果如下:
在上图的操作文件及文件夹列表中,我们看到了mysql目录,这个就是mysql的安装目录。
1.3提取mysql安装文件
找到了MySql,下一步就是将这个mysql文件夹及下面所有的子文件夹和文件全部打包。打包我们使用linux系统自带的tar指令。指令如下:
tar -zcf /root/mysql-noinstall-5.1.44.tar.gz mysql
指令格式:tar 参数 打包后的文件存储路径 要打包的目录或文件的路径
操作结果如下:
在这里,因为没有在参数上加v参数,所以没有列出打包文件的详细步骤,不过文件的确已经打包好并且放到/root下了。可以进入/root目录去看看。指令如下:
cd #
ll
操作结果如下:
可以看到,mysql-noinstall-5.1.44.tar.gz文件已经创建好了。下一步就是将文件传输到要安装mysql的服务器上了。传输方式很多,选一种自己习惯的方式,只要文件被拷贝过去就行了。
2.在目标服务器上创建用户和用户组
mysql服务器最好是限制启动mysql服务的用户的权限,使他们只能操作mysql自己的目录,不能操作其他目录。这样设置有利于服务器的安全管理。
2.1创建mysql用户组
我们使用groupadd指令,在linux服务器上创建用户组。指令如下:
groupadd mysql
操作结果如下:
2.2创建mysql用户
我们使用useradd指令,在linux服务器上创建用户组,指令如下:
useradd -g mysql -s "/sbin/nologin" mysql
指令含义:useradd 参数 用户名
参数含义:-g mysql,将用户加入mysql用户组
-s "/sbin/nologin",设定用户的shell权限,用户不能登录shell,这样就限制了mysql这个用户,只能在linux服务器本地使用,不能 从远程使用该用户登录linux服务器
操作结果如下:
3.将打包的mysql安装文件解包
用户和用户组创建好了,现在可以开始解包安装文件到我们的目录下了。由于我们要在同一台服务器上运行3个mysql实例。因此,目录规划如下:
所有的mysql,都安装在/usr/local目录下,用不同的mysql目录区分不同的mysql实例,我们采用目录名+端口号的形式来区分。因此,我们的/usr/local下的mysql目录结构如下:
/usr/local/mysql
/usr/local/mysql3306
/usr/local/mysql3307
/usr/local/mysql3308
注意:mysql这个目录,是为了配置硬链接而存在的,方便在任何目录下,都可以访问到mysql客户端程序。
3.1将打包文件mysql-noinstall-5.1.44.tar.gz解包
首先,将mysql-noinstall-5.1.44.tar.gz文件解包到/usr/local/mysql目录
3.1.1进入/usr/local目录
指令:
cd /usr/local
pwd
操作结果如下:
3.1.2解压文件
指令:
tar -zxf /root/mysql-noinstall-5.1.44.tar.gz
ll
执行结果如下
可以看到,mysql这个目录已经创建好了,/usr/local/mysql这个目录的创建工作就完成了。
3.1.3构建mysql3306、mysql3307、mysql3308这3个目录
我们已经有了mysql目录,构建另3个目录就很简单了,直接拷贝mysql目录就可以了。
指令:
cp -R mysql mysql3306
cp -R mysql mysql3307
cp -R mysql mysql3308
ll
操作结果如下:
到这里,我们的目录创建工作就结束了。
3.2安装系统数据库
由于多实例的需要,我们将所有的数据文件存储在/home目录下,数据文件目录分别对应于安装目录。命名方式一致。
目录规划如下:
/home/mysql3306
/home/mysql3307
/home/mysql3308
安装mysql默认数据库,可以使用mysql安装文件的bin目录下的mysql_install_db程序来完成。
指令如下:
/usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql3306 --datadir=/home/mysql3306 --user=mysql
执行结果如下:
重复以上步骤,将basedir和datadir修改成另外两个目录,就可以完成默认数据库的安装工作。
/usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql3307 --datadir=/home/mysql3307 --user=mysql
/usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql3308 --datadir=/home/mysql3308 --user=mysql
操作完成后,到/home目录下去看看吧。
指令:
ll /home/
如图所示:
至此,系统数据库的安装工作就完成了。
3.3创建并编辑配置文件my.cnf
由于在多实例的环境下,mysql的各个实例可以使用单独的配置文件,因此,我们也采用每个mysql实例使用单独的配置文件的方式。
mysql的示例配置文件,存放在mysql安装目录下的share/mysql/目录下,提供了my-huge.cnf、my-innodb-heavy-4G.cnf、my-large.cnf、my-medium.cnf和my-small.cnf共5种配置文件模板。可以根据服务器的实际需要进行配置文件的选择。在这里,我们使用的是my-medium.cnf这个配置文件模板。
3.3.1 拷贝my-medium.cnf文件到mysql各个示例的顶级目录
指令如下:
cp mysql/share/mysql/my-medium.cnf mysql3306/my.cnf
cp mysql/share/mysql/my-medium.cnf mysql3307/my.cnf
cp mysql/share/mysql/my-medium.cnf mysql3308/my.cnf
操作结果如下:
进入各个目录,我们就可以看到各个目录下,都有一个my.cnf配置文件了。
如图所示:
3.3.2编辑配置文件
由于配置文件使用的是默认的模板,我们需要根据我们的实际情况进行修改才能使用。
对配置文件的编辑如下:
1.用#注释掉[client]配置节的所有信息
2.在[mysqld]配置节,将port配置修改为我们要监听的端口3306、3307或3308
3.在[mysqld]配置节,将skip-locking配置修改为:skip-external-locking
4.在[mysqld]配置节,将sock配置修改为各个实例的socket文件路径
5.在[mysqld]配置节,修改server-id配置节,参数为IP地址第四节+端口号,如:IP:10.34.40.40,端口3306,参数为:403306
6.在[mysqld]配置节,增加pid-file配置节,参数各个实例的pid文件保存路径
如:我们要配置3308实例,则修改如下:
[client]
#password = your_password
#port = 3306
#socket = /tmp/mysql.sock
[mysqld]
pid-file = /home/mysql3308/mysql3308.pid
log-error = /home/mysql3308/mysql3308.err
port = 3308
socket = /tmp/mysql3308.sock
Skip-external-locking
……省略没有修改的配置……..
server-id = 403308
……省略没有修改的配置……..
根据以上信息,选择自己习惯的编辑器,依次修改/usr/local/mysql3306、/usr/local/mysql3307、/usr/local/mysql3308目录下的my.cnf为相应的配置信息。
至此,配置文件创建编辑完成。
3.4创建并修改服务文件
mysql的服务文件,和mysql模板配置文件一样,存放在安装目录的share/mysql目录下。名为mysql.server。
如图:
拷贝该文件到/etc/init.d目录下,并以mysqld+端口号的形式命名。如:3306端口的服务文件,文件名为mysqld3306
指令如下:
cp mysql/share/mysql/mysql.erver /etc/init.d/mysqld3306
结果如下:
重复以上操作,生成3307和3308端口的服务文件
cp mysql/share/mysql/mysql.erver /etc/init.d/mysqld3307
cp mysql/share/mysql/mysql.erver /etc/init.d/mysqld3308
下面来编辑服务文件,
需要修改服务文件的basedir和datadir配置节。将配置节的信息设定为各自的实例程序和数据所在的路径。
如:3306端口的服务文件,设置如下:
basedir=/usr/local/mysql3306
datadir=/home/mysql3306
重复以上步骤,用自己习惯的编辑器编辑3个服务文件,mysqld3306、mysqld3307和mysqld3308。
至此,服务文件的创建和编辑操作完成。
现在我们来启动mysql服务器吧。指令如下:
service mysqld3306 start
service mysqld3307 start
service mysqld3308 start
执行结果如下:
可以看到,我们的服务已经正常启动了。现在,我们来检验以下,linux系统的3306、3307、3308端口是否已经在监听状态了。
使用指令如下:
netstat -an | grep LISTEN
结果如下:
现在,我们可以看到,3306、3307、3308端口已经处于监听状态了。我们再看看3306、3307、3308端口的监听程序是什么。
使用指令:
lsof -i :3306
结果如下:
可以看到,3306端口是mysqld这个程序在监听。同样,我们检测下3307和3308端口。
结果如下:
可以看出,都是mysqld程序在监听。也就是说明,mysqld程序正在监听3306、3307、3308端口。需要注意的是,监听这3个端口的mysqld程序,是分别存放在/usr/local/mysql3306/bin、/usr/local/mysql3307/bin、/usr/local/mysql3308/bin中,是3个实例各自的程序在监听,互不影响。
4.设置mysql客户端
在mysql服务端配置完成之后,我们需要使用mysql客户端链接到mysql的各个实例上,看看mysql是否是按照我们设定的参数在运行。mysql的客户端,存放在/usr/local/mysql/bin目录下,文件名是mysql。这个目录是在配置mysql多实例的时候,从tar.gz包里面解压出来的(可以参考前面的文档)。
进入/usr/local/mysql/bin目录,运行mysql。
指令如下:
/usr/local/mysql/bin/mysql
让我们看看发生了什么。报错了,找不到一个文件[SOCK文件]。
如图所示:
这是因为,mysql配置了多实例之后,各个实例必须使用单独的sock文件防止相互影响。因此,在多实例的环境下,链接mysql服务器,需要指定特定的sock文件所在的路径。我们修改一下mysql的指令,修改如下:
/usr/local/mysql/bin/mysql --socket=/tmp/mysql3306.sock
执行,结果如图所示:
我们已经正常连接到mysql服务器上了。现在我们来看看是不是监听的3306端口,数据文件和程序文件是不是我们指定的目录。
我们用指令show variables like '%port%';来查看当前监听的端口。
在mysql > 提示符后面,输入指令:
show variables like '%port%';
执行结果如下:
我们可以看到,当前mysql监听的端口,的确是3306。然后我们来看看mysql的程序目录和数据目录。
在mysql > 提示符后面,输入指令:
show variables like '%dir%';
执行结果如下:
看输出结果的第一行和第四行,basedir是程序目录,datadir是数据目录。我们可以看到,程序目录是/usr/local/mysql3306,数据目录是/home/mysql3306.和我们实例配置时的设定是一致的。
有时候,在mysql客户端链接mysql服务器实例的时候,会提示error while loading shared libraries: libmysqlclient.so.16这样的错误。出现这个错误,可能是因为你的linux操作系统中的这个库文件位置不正确或不存在。解决方法很简单,将/usr/local/mysql/lib/mysql/libmysqlclient.so.16这个文件拷贝到/usr/bin目录下即可。指令如下:
cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib
5.设置mysql各个示例随操作系统自启动
mysql服务器实例配置好了,现在mysql也可以运行起来了。不需要每次启动服务器,都去手动启动mysql服务。设置指令如下:
chkconfig --level 3 mysqld3306 on
chkconfig --level 3 mysqld3307 on
chkconfig --level 3 mysqld3308 on
执行结果如下:
现在,我们来验证下,这3个实例是否添加成功:
使用指令:
chkconfig --list
执行结果:
可以看到,mysqld3306、mysqld3307和mysqld3308已经添加成功。现在,mysql的各个实例就能随linux操作系统启动而自动启动了。