我们所用的DBMS是mysql,开源,方便,小巧。但对大数据量来说性能不够好。
在linux下mysql的安装还是比较简单的,用yum install就行了。但我在安装的过程中还是遇到了一些问题。原因在于需要做自己内部的yum server,系统中需要使用python-mysqldb库,安装python-mysqldb之前需要安装mysql。本来是一个很简单的问题,但mysql的版本太多,mysql/mysql-server/mysql-client/mysqldb,一堆一堆的搞得头大。好不容易理清这些不同的mysql rpm之间的区别,发现安装mysql5.1.60后死都安装不上python-mysqldb。版本不支持,先开始降低到5.0.95,后来升级到5.1.61,都没有问题。
安装之后要做HA(高可用性),我们用的是drbd+heartbeat。一个VIP,对应到两台server,一台主,一台从,用heartbeat监控mysql服务和启动停止,用drbd进行数据同步,当主server mysql服务宕掉后自动切换到从server上,不需手动操作,但是切回来需要人工执行。安装和配置网上教程很多。最近我们的主server宕掉了,服务没有收到影响,说明效果还是很不错的。
做过HA后是做slave和master的同步。master上可以进行数据的读写,slave上只能允许读数据。要做这个的原因除了考虑数据的安全性之外,我们还有一部分的servers在美国,需要同步到内地的服务器上。美国有五台机器,其中一台做relay,直接同步到内地的master上,另外四台slave,同步到这台relay上。
这一切配置完成之后遇到两个问题。一个是slave经常同步出错,显示的错误代码是1062,网上查到的解决方法有两种:
手动修改:
stop slave;
set global SQL_SLAVE_SKIP_COUNTER=1;
start slave;
自动修改:
在配置文件(/etc/my.cnf)中添加:slave-skip-errors=1062
目前还没有在配置文件当中添加这一项,因为考虑到如果完全跳过这个code,是否会造成有些数据不能完全同步。这个问题的深层次原因还有待寻找。
第二个问题就是mysql的性能问题。刚开始的做法是直接拷贝安装完成之后的my_huge.cnf作为mysql的配置文件,后来在系统运行的过程中发现这样的配置不能满足我们日常的需要,所以需要去研究配置文件中每个参数的具体含义。下面是一些对于Innod engine比较重要的:
key_buffer_size=1024M (指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能,对于内存在4GB左右的服务器该参数可设置为256M或384M)
sort_buffer_size=32M
read_buffer_size=32M(查询排序与读表时单连接缓冲区大小,对于内存在4GB左右的服务器推荐设置为6-8M)
wait_timeout=10 (指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10,目前production中没有进行设置)
innodb_flush_log_at_trx_commit = 1(每次事务的结束都会触发Log Thread 将log buffer 中的数据写入文件并通知文件系统同步文件。这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash 或者是主机断电都不会丢失任何已经提交的数据。但是设置为1时MySQL的运行效率变慢,实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度)
Innod_buffer_pool_size=10G(InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。根据MySQL官方手册,对于2G内存的机器,推荐值是1G)
max-connections=1000
thread_cache_size=64