Category: Opensource

  • MySQL VS. MariaDB 之日期格式差异

    MariaDB Foundation 号称 MariaDB 是 MySQL 的替代品, 但我发现它们之间还是有些不兼容的地方(而且不在已列出的清单里). MariaDB 似乎对日期格式要求更为严格. 以下 SQL 的执行结果就很有不同, 在 MySQL 中 changed_at 是正常的 datetime, 但是在 MariaDB 中 changed_at 完全是 ‘0000-00-00 00:00:00’ 的样子. INSERT INTO … SELECT … GREATEST( COALESCE(`inspection`.`ts`, 0), COALESCE(`inspection_details`.`ts`, 0), COALESCE(`open_time_reason`.`ts`, 0) ) AS `changed_at` ON DUPLICATE KEY UPDATE … `changed_at` = VALUES(`changed_at`) 解决方法是添加一个明确的格式转换: CONVERT(… , DATETIME) CONVERT(…

  • 土法制造 DDNS 完整版

    节日快乐! 最近我又对之前的脚本完善了一下, 添加了对 CloudFlare DNS API 的呼叫, 这样 DDNS 才名副其实吧: #!/bin/bash function update_dns { logger ‘Prepare to update DNS…’ curl -i https://www.cloudflare.com/api_json.html \ -d ‘a=rec_edit’ \ -d ‘id=DOMAIN_ID’ \ -d ‘tkn=THIS_IS_MY_KEY_GO_GET_YOURS’ \ -d ’email=MY_EMAIL’ \ -d ‘z=raynix.info’ \ -d “content=$1” \ -d ‘type=A’ \ -d ‘name=XXX’ \ -d ‘ttl=1′ |logger } url=’http://direct.raynix.info/ip.php’ last=’/tmp/extip’ rcpt=’MY_EMAIL’ extip=`curl…

  • 土法制造 DDNS

    自从上次我用树莓派(raspberry pi)做了个家用服务器后, 动态域名解析(DDNS)就从一种懒得过问的技术变成必须的解决方案了, 因为家里的 ADSL 的 IP 地址不是固定的, 偶尔会变化. 我看了若干现成的 DDNS 服务, 虽然有免费选项, 但限制颇多, 甚至有的要插播广告… 其实 DDNS 没啥技术含量的东西, 基本逻辑就是在客户端发送请求到服务端, 一旦发现客户端的外部 IP 地址已变, 就更新对应的 DNS 记录. 首先来写客户端, 使用的是我擅长的 Shell Script: #!/bin/bash url=’http://direct.raynix.info/ip.php’ last=’/tmp/extip’ rcpt=’[email protected]’ extip=`curl $url` echo $extip |diff $last – if [ $? == 0 ]; then exit 0 else logger ‘last IP: ‘ `cat…

  • 小试 MariaDB Galera Cluster

    前些时, 难得老板关注新技术, 哈哈, 我于是有机会尝试一下数据库服务器集群. 什么是 Galera Cluster? 简单的说就是3个或以上的 MariaDB 服务器相互作为镜像. 详细介绍在这里. 我按照 Digital Ocean 的指点, 用 AWS 上 3 个虚拟机做了个最小的集群, 下面是我的一些心得(针对 MariaDB 10.0.17): 首先集群的成员个数一定是奇数, 也就3, 5, 7… 因为有的时候个别成员的数据出现异样的时候, 整个集群会以”少数服从多数”的方式修正数据. 虽然集群是 master – master 方式进行数据同步的, 但如果多个成员同时更新相同的数据集合时, 集群内就很容易出现冲突, 这也就降低了性能以及可靠度. 目前我觉得可行的应用方式, 就是将所有的数据更新(insert, update, delete)都集中到一个成员上, 然后所有的查询(select)可以由所有成员分担. 就好像传统的 master – slave 方式, 嗯, 比较失望, 不过至少倚靠 HAProxy, 当一个成员挂了会自动有另一个来接替, 也不会耽误太多的事情. 估计还有一段距离才能把 Galera…

  • 利用 bash 命令做 SQL 数据修补

    如果是把一个 DB 或者一个 table 从一个服务器送到另一个, 那么使用 mysqldump 命令就可以了. 但有的时候, 需要的数据可能只是若干条记录, 就不能用 mysqldump 了. 奇怪的是我 google 了一番居然也没找到很方便的方法. 求人不如求自己吧, 下面是用 bash 命令的解决方法: mysql <database> -uroot -e “select * from <table> where <condition>…” |tail -n +2 |sed -e ‘s/^/(“/g’ -e ‘s/$/”)/g’ -e ‘s/\t/”,”/g’ |while read values; do echo “insert into <table> values $values”; done 然后把输出的 SQL 在目标服务器上运行即可. 记得把<…

  • 开始用 Arch Linux

    用 Linux 的好处是选择多多, 但有的时候确实很难选, 俗称”挑花了眼”. 我基本上的要求有: 相对新潮, 各个模块的版本都是最新的才好(当然, 不是说服务器上的系统) 桌面是(或者可以是) Gnome Shell. 很多人恨 GS 恨得牙龈都发炎了, 但我对 GS 情有独钟 社区活跃, 有问题多半能 Google 到结果 没有商业气味, 没有大公司在背后控制 这样筛选下来 Ubuntu 太商业化了, 奔着下一个 WindowsXP 的路子去了; Fedora 社区不给力; Debian 太保守… 唯有 Arch Linux 几乎完美. 唯一麻烦的是, AL 相对高端, 没有”一直点 Next”类安装界面, 安装 AL 是从 fdisk, mkfs, mount, chroot 这样的命令开始的(当然比起 Gentoo 的 gcc, make,…

  • 在 Debian Wheezy 上用 Discourse 搭建论坛

    以新建的 VM 为例, 下面是安装直到运行  的一些必要步骤 1, 首先是系统必须的软件包, 这里我用nginx作为HTTP服务器, 其他的也可以的: sudo apt-get install build-essential nginx imagemagick 2, Discourse 需要的数据库和缓存. Wheezy 缺省的 postgresql 是 9.1 的, 可以参考这个来装 9.3: sudo apt-get install postgresql-9.3 postgresql-server-dev-9.3 postgresql-contrib-9.3 sudo apt-get install redis-server 3, 添加 discourse 系统/数据库用户, 建DB, Discourse 将以此用户的身份运行(git clone 部分就省略了). sudo adduser discourse –home /var/www/discourse sudo su – postgres -c…

  • LVM 快照(snapshot)的第二种用法

    之前我已总结了 LVM 快照的第一种用法: 利用 LVM 在线抓取 MySQL 数据库快照, 也可以扩展到任何需要在线生成磁盘快照的应用. 自 LVM 2.0 以来, 镜像分区不只是只读的, 而且可写. 而写入快照分区的一种应用就是造”沙盒(sandbox)”, 在 Xen VM 环境的具体步骤如下: 1, 假设供测试的虚拟机 test, 分区是 /dev/vm/test-disk, 为其生成 10GB 快照分区 test-ss: lvcreate -s -n test-ss -L10G /dev/vm/test-disk 2, 将 test 虚拟机关机, 可以 ssh root@test “shutdown -h now” 或者 xm shutdown test 3, 复制 /etc/xen/test.conf 到 test-s1.conf, 并将磁盘分区…