1. 程式人生 > >apache Ignite 實戰

apache Ignite 實戰

apache Ignite 實戰

#安裝apache Ignite
1,下載
wget http://mirrors.tuna.tsinghua.edu.cn/apache//ignite/2.6.0/apache-ignite-fabric-2.6.0-bin.zip
2,解壓
unzip apache-ignite-fabric-2.6.0-bin.zip
3,進入目錄
cd /opt/tmp/apache-ignite-fabric-2.6.0-bin
4,啟動
bin/ignite.sh
這個時候應該報需要java環境,安裝jdk8-jdk9目前支援
下載jdk8直接解壓到指定目錄
5,設定jdk環境變數
vim /etc/profile
最後行加:`

export JAVA_HOME=/opt/tmp/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

`6,使環境變數生效
source /etc/profile
啟動
bin/ignite.sh
成功啟動!
7,下載一個DBeaver隨便玩了

php+ignite

使用記憶體資料庫主要解決實際專案瓶頸結合專案語言研究php來操作:

  1. 配置php操作方案ODBC(庫名錶名都使用大寫);
<?xml version="1.0" encoding="UTF-8"?>

<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<!-- Enabling ODBC. -->
	<property name="odbcConfiguration">
	  <bean class="org.apache.ignite.configuration.OdbcConfiguration"/>
	</property>
	<!-- Configuring cache. -->
	<property name="cacheConfiguration">
	  <list>
		<bean class="org.apache.ignite.configuration.CacheConfiguration">
		  <property name="name" value="ALIPOS"/>
		  <property name="cacheMode" value="PARTITIONED"/>
		  <property name="atomicityMode" value="TRANSACTIONAL"/>
		  <property name="writeSynchronizationMode" value="FULL_SYNC"/>
		  <property name="queryEntities">
			<list>
			  <bean class="org.apache.ignite.cache.QueryEntity">
				<property name="keyType" value="java.lang.Long"/>
				<property name="keyFieldName" value="sid"/>
				<property name="valueType" value="ALPSHOP"/>
				<property name="fields">
				  <map>
					<entry key="sid" value="java.lang.Long"/>
					<entry key="sname" value="java.lang.String"/>
				  </map>
				</property>
				<property name="indexes">
					<list>
						<bean class="org.apache.ignite.cache.QueryIndex">
							<constructor-arg value="sname"/>
						</bean>
					</list>
				</property>
			  </bean>
			</list>
		  </property>
		</bean>
	  </list>
	</property>
</bean>
吐槽,這csdn佔用關鍵字,不好用

3.根據配置檔案啟動
./ignite.sh /opt/tmp/apache-ignite-fabric-2.6.0-bin/config/alipos-config.xml
4.安裝UNIXODBC
5.構建編譯igniteODBC
libtoolize && aclocal && autoheader && automake --add-missing && autoreconf
報錯提示需要更高版本
手動安裝相關版本
libtoolize && aclocal && autoheader && automake --add-missing && autoreconf
./configure --enable-odbc --disable-node --disable-core
make 提示
g++什麼語法錯誤
升級gcc版本
curl -Lks http://www.hop5.in/yum/el6/hop5.repo > /etc/yum.repos.d/hop5.repo
yum install gcc gcc-g++ -y
升級到4.8.2
make提示
AM_PROG_AR什麼鬼報錯
編輯/opt/tmp/apache-ignite-fabric-2.6.0-bin/platforms/cpp/configure.ac找到
AM_PROG_AR替換m4_pattern_allow([AM_PROG_AR], [AM_PROG_AR])
make沒報錯
make install 成功構建
安裝igniteODBC到ODBC
編輯$IGNITE_HOME/platforms/cpp/odbc/install/ignite-odbc-install.ini檔案,並且確保Apache Ignite段的Driver引數指向libignite-odbc.so所在的正確位置;
要安裝Ignite的ODBC驅動,可以使用如下的命令:
odbcinst -i -d -f $IGNITE_HOME/platforms/cpp/odbc/install/ignite-odbc-install.ini
,要執行這條命令,很可能需要root許可權。
執行成功檢視ODBC配置
odbcinst.ini已經配置
手動配置odbc.ini
[Ignite]
Description = Apache Ignite
Driver = Apache Ignite
測試:isql ignite
什麼鬼,又報錯undefined symbol: clock_gettime
編輯/opt/tmp/apache-ignite-fabric-2.6.0-bin/platforms/cpp/common/Makefile.am找到
libignite_common_la_LDFLAGS =
-no-undefined
-L/usr/local/lib
-ldl
下加-lrt
重新make clean
libtoolize && aclocal && autoheader && automake --add-missing && autoreconf
./configure --enable-odbc --disable-node --disable-core
make && make install
測試:isql ignite 成功
安裝php_odbc擴充套件
wget http://pecl.php.net/get/PDO_ODBC-1.0.1.tgz
tar -zxvf PDO_ODBC-1.0.1.tgz
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-pdo-odbc=unixODBC,/usr
make
該處報錯:/web/PDO_ODBC-1.0.1/pdo_odbc.c:34:1: 錯誤:未知的型別名‘function_entry’ function_entry pdo_odbc_functions[] = { ^/web/PDO_ODBC-1.0.1/pdo_odbc.c:35:2: 警告:標量初始化帶花括號 經查,是 function_entry的問題,修改 pdo_odbc.c中的程式碼,改為static const zend_function_entry
make
make install
在php.ini檔案新增下面一行
extension = “pdo_odbc.so”
重啟php-fpm
/opt/ngx/php/sbin/php-fpm: error while loading shared libraries: libsybdb.so.5: cannot open shared object file: No such file or directory
什麼鬼
yum install freetds
重啟php-fpm 正常
從 php.ini 檢查 pdo_odbc 是否安裝成功。
php程式碼測試:

try {
				// dsn連線串
				$dsn="odbc:Driver={Apache Ignite};ADDRESS=127.0.0.1:10800;CACHE=ALIPOS";
				$dbh = new PDO($dsn);
				// Changing PDO error mode.
				$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
				//$res = $dbh->query('SELECT * from ALPSHOP');
				$dbs =$dbh->prepare('INSERT INTO ALIPOS.ALPSHOP (sid, sname) VALUES (?, ?)');
				$sid = 1;
				$sName = "Bond";
				// Binding parameters.
				$dbs->bindParam(1, $sid);
				$dbs->bindParam(2, $sName);
				// Executing the query.
				$dbs->execute();
				$ret=$dbh->query("select cast(1 as varbinary(max)) as col",PDO::FETCH_ASSOC);
				if ($res == FALSE)
					print_r("Exception");

				// Printing results.
				foreach($res as $row) {
					//print_r($row);
				}

			} catch (PDOException $e) {
				print "Error!: " . $e->getMessage() . "\n";
				die();
			}

和windows效果一樣,增,刪,改,沒問題,查詢記憶體超出炒蛋。
直接使用odbc

cd /opt/tmp/php-5.5.38/ext/odbc
 /usr/local/php/bin/phpize
 sed -ri '[email protected]^ *test +"\$PHP_.*" *= *"no" *&& *PHP_.*=yes *[email protected]#&@g' configure
  ./configure --with-php-config=/opt/ngx/php/bin/php-config --with-unixODBC=/usr/local
  make && make install

php程式碼直接測試

$conn=odbc_connect('Driver={Apache Ignite};ADDRESS=127.0.0.1:10800;CACHE=ALIPOS','','');
if (!$conn)
{
	exit("lost " . $conn);
}

$sql="select cast(1 as varbinary(max)) as col";
$rs=odbc_exec($conn,$sql);
print_r($rs);
if (!$rs)
{
	exit("SQL error");
}

什麼鬼,記憶體超出還是,
仔細看文件(官網已知bug,5.6以後版本修復?)
檢視ODBC原始碼,明顯拿不到欄位buf大小產生的錯誤,ignite原因?沒有賬號登陸提問,算了!
不活躍的專案慎用,呵呵~
沒關係,最主要開源,結合自己專案自己能改就行
下手修改php_odbc.c檔案
找到odbc_bindcols方法下

rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), colfieldid,
								NULL, 0, NULL, &displaysize);
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
				if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && colfieldid == SQL_DESC_OCTET_LENGTH) {
					 /* This is  a quirk for ODBC 2.0 compatibility for broken driver implementations.
					  */
					charextraalloc = 1;
					rc = SQLColAttributes(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_DISPLAY_SIZE,
								NULL, 0, NULL, &displaysize);
				}

改為

rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), colfieldid,
								NULL, 0, NULL, &displaysize);
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
				if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && colfieldid == SQL_DESC_OCTET_LENGTH) {
					 /* This is  a quirk for ODBC 2.0 compatibility for broken driver implementations.
					  */
					charextraalloc = 1;
					rc = SQLColAttributes(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_DISPLAY_SIZE,
								NULL, 0, NULL, &displaysize);
				}else if (displaysize<0) {
					displaysize=256;
				}

注:字串欄位沒有拿到欄位最大允許值時用256,意味著你的字串型別都限制了,可以根據需要修改大小。
重新編譯,測試正常
自此,php增刪改查ignite完全正常
下一步生產環境資料效能測試