2008年12月7日星期日

MySQL海量数据优化

经常见到有人对MySQL处理海量数据(几百万,几千万的数据就不要往海量上面扯了)的能力持怀疑的态度,根据我的经验,MySQL处理单表亿级数据没有任何问题。

数据库最重要的是安全稳定,速度其次。在做任何优化之前,你都必须做好最坏的打算,一定要有备份和应急方案!

要有一个稳定安全的数据库,你必须:
  • 至少要有一个热备
  • UPS
  • 做合适的RAID。RAID0+1,RAID5或者RAID6
如果可以,最好:
  • 使用xfs而不是ext3。哪天reboot后,你发现磁盘检查要半天,还不能停止,哭都来不及
  • 将数据库数据放入盘柜。更安全,访问更快
现在切入正题,开始优化:
  • 使用64位系统。这是老生常谈了,只要谈优化就少不了这个。不仅MySQL的性能有提升,内存也能使用超过4G。
  • 选择合适的引擎。一般来讲,innodb适合写频繁的表,myisam适合读频繁的表。
  • 建立正确的索引。推荐这篇文章。虽然比较老了,但很经典。
  • 优化my.cnf里面的参数。主要关心和buffer有关的参数,innodb_buffer_pool_size之类的
  • 使用memcache。可以把访问频繁,不经常改动的小表放入memcache;程序对数据库的读操作之前最好访问一下memcache。
  • 打开slow_query_log选项。解决出现的慢查询语句。
  • 优化sql语句。
  • 使用SAS而不是SATA。数据库对硬盘要求很高,很多时候,换个快的硬盘就能有立竿见影的效果。
优化不可能一蹴而就,它是一个长期持续的过程,比如一些参数要在长期的运行中观察测试才能得到一个最优的值。

ps:这篇文章不要错过

2008年11月22日星期六

[pitfall]mysql dns反解析导致性能急剧下降

最近,发现系统性能急剧下降,经过调试,发现代码和数据库都没有性能问题,但是获得数据库connection cursor 的时间增加了上百倍,导致性能出现问题。

查看连接用户,发现大量的unauthenticated user,修改/etc/my.cnf,增加skip-name-resolve参数,重新启动数据库后问题解决。

今年年初时已经出现过一次这样的情况,原因是DNS不稳定。那次以后,在/etc/init.d/mysqld启动脚本里面增加了--skip-name-resolve的选项。但是没有更改my.cnf,以至于迁移时漏掉了这个参数。

数据库迁移并不只是简单的文件拷贝,其中的曲折只有亲手做的才明白。

2008年11月16日星期日

[pitfall]在RHEL下要万分小心SELinux

SELinux(Security-Enhanced Linux)是美国国家安全局(NAS)和SElinux社区的一个联合项目,在RHEL是必须安装的组件。它在linux自身提供的权限控制外,对于一些关键敏感的程序和文件提供额外的保护。

不错,系统更加安全了,但是SA如果不熟悉SELinux的话(或者根本不知道有这个玩意儿),就会出现很多权限出错的问题。

前几天就被SELinux折腾的够呛。

当时现象如下:

my.cnf里面配置的user=mysql.

mysqld_safe &启动时报错:InnoDB: Operating system error number 13 in a file operation,The error means mysqld does not have the access rights to the directory.


实际上存放这个数据文件的文件夹我已经chown mysql:mysql dirname ,chmon -R 777 dirname了。

怀疑是SELinux的问题,disabled重启之后问题依旧。

后来发现,只有把数据文件放在/var/lib/mysql下,数据库才可以正常启动.或者mysqld_safe --user=root &也可以启动。


当晚发现权限问题的时候,就怀疑是SELinux在捣乱,但是没有想到disabled重启机器以后,SELinux依然阴魂不散......又让我多花了一天的时间排除其他的可能性。

ls -Z可以看到selinux在文件夹或者文件上面打的‘标签’:user_u:object_r:user_home_t:s。

如果一个文件你是在SELinux打开的时候创建的,那么即使你关闭SELinux,它的权限控制还是会起作用的。

可以通过chcon来改变权限。或者干脆重装系统。

----------------------
ubuntu下面默认安装apparmor而不是SELinux,它同样也会导致一些莫名其妙的权限问题,也要注意。
链接

在RHEL下面通过ISCSI连接盘柜

环境:
服务器系统RHEL 5.2,盘柜型号HP MSA2000 2012i

第一次使用盘柜,把步骤记下来,其他操作系统和RedHat的配置步骤类似。

1.选择安装redhat server版本

2.安装后使用setup命令,修改防火墙和网络配置。记得打开ssh,http等端口(最好关闭防火墙和SELinux)

3.安装mysql和gcc
1)挂载安装光盘:
#su
#mkdir /mnt/disk
#mount /dev/cdrom /mnt/disk

2)rpm安装 (会有依赖的包,按照系统提示安装依赖的包即可)
#cd /mnt/disk/Server
#find *mysql*
#rpm -ivh mysql-5.0.45-7.el5.i386.rpm
#rpm -ivh mysql-server-5.0.45-7.el5.i386.rpm
#rpm -ivh mysql-devel-5.0.45-7.el5.i386.rpm #mysql.h等头文件需要先安装这个包
#find *gcc*
#rpm -ivh gcc-4.1.2-42.el5.i386.rpm
#rpm -ivh gcc-c++-4.1.2-42.el5.i386.rpm
#find *zlib*
#rpm -ivh zlib-1.2.3-3.i386.rpm
#rpm -ivh zlib-devel-1.2.3-3.i386.rpm

3)配置mysql(root用户执行,不然会报错)
#mysql_install_db
#mysqld_safe &
#mysql
看到进入mysql提示界面,就说明mysql安装好了。默认没有用户名和密码,需要自己配置.
#mysqladmin -uroot -p

4.安装iscsi(ubuntu下面是安装open-iscsi)
#cd /mnt/disk/Server
#find *iscsi*
#rpm -ivh iscsi-initiator-utils-6.2.0.868-0.7.el5.i386.rpm

5.配置iscsi
#su
#vim /etc/iscsi/iscsid.conf

node.startup = automatic #这一项在redhat是默认‘自动’的,ubuntu里面是默认‘手动’的
node.session.auth.username = My_ISCSI_USR_NAME
node.session.auth.password = MyPassword
discovery.sendtargets.auth.username = My_ISCSI_USR_NAME
discovery.sendtargets.auth.password = MyPassword
# /etc/init.d/iscsi start

6.连接盘柜 (如果有些命令找不到,试一试/sbin下面的。比如/sbin/iscsiadm)
#iscsiadm -m discovery -t sendtargets -p 10.0.0.63
#/etc/init.d/iscsi start

应该可以看到盘柜了,信息会是这样:
Stopping iSCSI daemon: /etc/init.d/iscsi: line 33: 28218 Killed /etc/init.d/iscsid stop
iscsid dead but pid file exists [ OK ]
Turning off network shutdown. Starting iSCSI daemon: [ OK ]
[ OK ]
Setting up iSCSI targets: Logging in to [iface: default, target: iqn.1986-03.com.hp:storage.msa2012i.0830d5d413.a, portal: 10.0.0.64,3260]
Logging in to [iface: default, target: iqn.1986-03.com.hp:storage.msa2012i.0830d5d413.a, portal: 10.0.0.63,3260]
Login to [iface: default, target: iqn.1986-03.com.hp:storage.msa2012i.0830d5d413.a, portal: 10.0.0.64,3260]: successful
Login to [iface: default, target: iqn.1986-03.com.hp:storage.msa2012i.0830d5d413.a, portal: 10.0.0.63,3260]: successful
[ OK ]


7.在盘柜的web页面配置

8.服务器挂载盘柜
#/etc/init.d/iscsi restart
#fdisk -l
可以看到盘柜了,找到dev下面的对应盘即可
如果没有格式化,执行 # mkfs.ext3 /dev/sdd1
#mkdir /mnt/iscsi
# mount /dev/sdd1 /mnt/iscsi

9.开机启动自动挂载
#vim /etc/fstab
/dev/sdd1 /mnt/iscsi ext3 _netdev 0 0

HP MSA2000 2012i 的盘柜在同一个volume上面只能有一台服务器连接上去写,不然会有写冲突。